我有像(整个文件的特定部分)的文本文件;
! lat long elev (m)
! 44.5199005 11.6468000 50.4276
我需要提取第二行并将其保存在另一个文本文件中。数字是可变的,文本中也多次出现“!”语法。第一行的“!”和“lat”之间总是有 8 个空格,但第二行不是这样。是否有任何命令允许我提取下一行grep "! lat" text
答案1
您可以使用grep -A1 'expression'
来自手册:
-A num
--after-context=num
Print num lines of trailing context after matching lines.
就你的情况而言:
grep -A1 "! lat" foo | grep -v "! lat"
应该只提取第二行。
注意:
您可以使用grep -P '^! {8}lat'
而不是键入 many 。这样不容易出错。该
-P
标志启用 perl 样式正则表达式,并且{8}
('{' 之前有一个空格)精确匹配 8 个空格。
答案2
grep
您可以使用选项一次性获得所需的输出-z
,将输入文件的行视为由 NUL 字符而不是换行符分隔,以便换行符可以逐字匹配。您可以这样做:
grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
-P
将使我们能够使用 PCRE,-o
将只获取所需的部分!\s{8}lat[^\n]*\n
lat
将匹配后面有 8 个空格的行!
,还将匹配结尾的换行符,\K
将丢弃此匹配[^\n]+
然后将匹配下一行,即我们想要的输出。
这里我还假设后面没有空格lat
,如果必须至少有一个空格,您可以这样做:
grep -Pzo '!\s{8}lat\s+[^\n]*\n\K[^\n]+' file.txt
例子:
$ 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
答案3
awk
awk '/! {8}lat/ {a=1; next} a {a=0; print};' foo
sed
sed -n '/! \{8\}lat/{n;p}' foo