我有文本文件(整个文件的特定部分);
! lat long elev (m)
! 44.5199005 11.6468000 50.4276
Run Code Online (Sandbox Code Playgroud)
我需要提取第二行并将它们保存在另一个文本文件中。数字是可变的和“!” 文中也多次出现语法。对于第一行,“!”之间总是有 8 个空格。和“纬度”,但第二行的情况并非如此。是否有任何命令可以让我在之后提取下一行grep "! lat" text
您可以使用 grep -A1 'expression'
从手册:
-A num
--after-context=num
Print num lines of trailing context after matching lines.
Run Code Online (Sandbox Code Playgroud)
在你的情况下:
grep -A1 "! lat" foo | grep -v "! lat"
Run Code Online (Sandbox Code Playgroud)
应该只提取第二行。
注意:
您可以使用grep -P '^! {8}lat'而不是键入 many 。这不太容易出错。该-P标志启用 perl 样式的正则表达式,并且{8}('{' 之前有一个空格)正好匹配 8 个空格。
您可以grep使用-z选项一次性获得所需的输出,以处理由 NUL 字符而不是换行符分隔的输入文件行,以便换行符可以逐字匹配。你可以做:
grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
Run Code Online (Sandbox Code Playgroud)
-P将使我们能够使用 PCRE,-o只会为我们提供所需的部分
!\s{8}lat[^\n]*\n将匹配带有latafter!和 8 个空格的行,也将匹配尾随的换行符,\K将丢弃此匹配
[^\n]+ 然后将匹配下一行,即我们想要的输出。
在这里,我还假设 之后没有空格lat,如果必须至少有一个空格,您可以这样做:
grep -Pzo '!\s{8}lat\s+[^\n]*\n\K[^\n]+' file.txt
Run Code Online (Sandbox Code Playgroud)
例子:
$ cat file.txt
! lat long elev (m)
! 44.5199005 11.6468000 50.4276
! 30.5199005 2445.6468000 23.89
$ grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
! 44.5199005 11.6468000 50.4276
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2530 次 |
| 最近记录: |