如何从匹配字符串打印文件直到 EOF
how to print file from the match string until EOF
以下命令打印文件直到匹配 WORD
awk '1;/WORD/{exit}' file
但是如何打印文件从字符串 WORD 到文件末尾不包括字符串 WORD?
正如 Etan Reisner 在评论中所说,this answer 中有一本很好的范围模式食谱。但最简单的从模式匹配到文件末尾的方法是:
awk '/WORD/,0' file
为了从包含模式的行之后的行开始打印,我们可以这样做:
awk 'found,0;/WORD/{found=1}' file
要在WORD后面也打印第一行匹配WORD的部分,只需要修改最后一个动作,但是用显式调用match
代替正则表达式更方便设置 RSTART 和 RLENGTH:
awk 'found,0;match([=12=],/WORD/){found=1;print substr([=12=], RSTART+RLENGTH}'
范围模式的形式为expression,expression,意思是匹配从匹配第一个表达式的第一行到匹配最后一个表达式的第一行,包括在内。重复该范围,直到文件被完全处理。
在这些示例中,第二个表达式的计算结果始终为 0(假),因此范围永远不会终止,一旦模式成功,所有行都会匹配。
类似地,解决 "print all lines until a pattern" 的另一种方法如下,尽管它效率较低,因为它读取整个文件:
awk 'NR==1,/WORD/' file
此外,如果目标是仅打印模式实例(而不是包含模式的完整行,我们可以对原始程序进行简单修改:
awk 'match([=14=], /WORD/){print(sub([=14=],1,RSTART+RLENGTH)); exit}1'
这可能就是您想要的:
$ cat file
As market-days are wearing late,
And folk begin WORD to tak the gate;
While we sit bousin, at the nappy,
And gettin fou and unco happy,
$ awk '!f && sub(/.*WORD/,""){f=1} f' file
to tak the gate;
While we sit bousin, at the nappy,
And gettin fou and unco happy,
如果文本只有一个 pattern
,这个 gnu awk
(gnu 由于 RS)将起作用:
awk -v RS="WORD" 'NR>1' file
它将作为 Eds 解决方案,从 WORD
之后的第一个数据开始,并将该行的其余部分和所有下一行打印到 EOF
这将在找到 WORD
之后打印下一行,直到 EOF
如果您需要 WORD
之后同一行的数据,请查看 Eds answer。
awk 'f;/WORD/{f=1}' file
例子,模式four
cat file
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
10 ten
awk 'f;/four/ {f=1}' file
5 five
6 six
7 seven
8 eight
9 nine
10 ten
这可能对你有用 (GNU sed):
sed '1,/WORD/{/WORD/!d;s//\n/;D}' file
这将删除 WORD 之前的所有行,然后用换行符替换 WORD 并删除直到并包括换行符。其余文件正常打印。
以下命令打印文件直到匹配 WORD
awk '1;/WORD/{exit}' file
但是如何打印文件从字符串 WORD 到文件末尾不包括字符串 WORD?
正如 Etan Reisner 在评论中所说,this answer 中有一本很好的范围模式食谱。但最简单的从模式匹配到文件末尾的方法是:
awk '/WORD/,0' file
为了从包含模式的行之后的行开始打印,我们可以这样做:
awk 'found,0;/WORD/{found=1}' file
要在WORD后面也打印第一行匹配WORD的部分,只需要修改最后一个动作,但是用显式调用match
代替正则表达式更方便设置 RSTART 和 RLENGTH:
awk 'found,0;match([=12=],/WORD/){found=1;print substr([=12=], RSTART+RLENGTH}'
范围模式的形式为expression,expression,意思是匹配从匹配第一个表达式的第一行到匹配最后一个表达式的第一行,包括在内。重复该范围,直到文件被完全处理。
在这些示例中,第二个表达式的计算结果始终为 0(假),因此范围永远不会终止,一旦模式成功,所有行都会匹配。
类似地,解决 "print all lines until a pattern" 的另一种方法如下,尽管它效率较低,因为它读取整个文件:
awk 'NR==1,/WORD/' file
此外,如果目标是仅打印模式实例(而不是包含模式的完整行,我们可以对原始程序进行简单修改:
awk 'match([=14=], /WORD/){print(sub([=14=],1,RSTART+RLENGTH)); exit}1'
这可能就是您想要的:
$ cat file
As market-days are wearing late,
And folk begin WORD to tak the gate;
While we sit bousin, at the nappy,
And gettin fou and unco happy,
$ awk '!f && sub(/.*WORD/,""){f=1} f' file
to tak the gate;
While we sit bousin, at the nappy,
And gettin fou and unco happy,
如果文本只有一个 pattern
,这个 gnu awk
(gnu 由于 RS)将起作用:
awk -v RS="WORD" 'NR>1' file
它将作为 Eds 解决方案,从 WORD
之后的第一个数据开始,并将该行的其余部分和所有下一行打印到 EOF
这将在找到 WORD
之后打印下一行,直到 EOF
如果您需要 WORD
之后同一行的数据,请查看 Eds answer。
awk 'f;/WORD/{f=1}' file
例子,模式four
cat file
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
10 ten
awk 'f;/four/ {f=1}' file
5 five
6 six
7 seven
8 eight
9 nine
10 ten
这可能对你有用 (GNU sed):
sed '1,/WORD/{/WORD/!d;s//\n/;D}' file
这将删除 WORD 之前的所有行,然后用换行符替换 WORD 并删除直到并包括换行符。其余文件正常打印。