【问题标题】:how to print file from the match string until EOF如何从匹配字符串打印文件直到EOF
【发布时间】:2015-05-18 21:16:16
【问题描述】:

以下命令打印文件,直到匹配 WORD

 awk '1;/WORD/{exit}' file

但是如何从字符串 WORD 打印文件直到文件末尾不包括字符串 WORD?

【问题讨论】:

  • 精彩的答案here 包含对您问题的答案。
  • 直到字符串 WORD 才会打印,它会打印到包含字符串 WORD 的行尾。发布一些示例输入和预期输出,如果在您的实际输入中可能的话,将“WORD”放在一行的中间。还要考虑如果 NEWORDER 出现在文件中间,您希望如何处理它 - 中间的 WORD 是否与您的字符串匹配?

标签: linux bash awk sed solaris


【解决方案1】:

正如 Etan Reisner 在评论中所说,this answer 中有一本很好的范围模式食谱。但是从模式匹配到文件末尾的最简单方法是:

awk '/WORD/,0' file  

为了从包含模式的行后面的行开始打印,我们可以这样做:

awk 'found,0;/WORD/{found=1}' file

若要同时打印第一行中与 WORD 后面的 WORD 匹配的部分,只需要修改最后一个操作,但为了设置 RSTART 和长度:

awk 'found,0;match($0,/WORD/){found=1;print substr($0, RSTART+RLENGTH}'

范围模式的形式为表达式,表达式,意思是从匹配第一个表达式的第一行到匹配最后一个表达式的第一行,包括在内。重复该范围,直到文件被完全处理。

在这些示例中,第二个表达式的计算结果始终为 0(假),因此范围永远不会终止,并且一旦模式成功,所有行都会匹配。

同样,解决“打印所有行直到一个模式”的另一种方法如下,虽然它效率较低,因为它读取整个文件:

awk 'NR==1,/WORD/' file

此外,如果目标是只打印模式的实例(与包含模式的完整行相反,我们可以对原始程序进行简单修改:

awk 'match($0, /WORD/){print(sub($0,1,RSTART+RLENGTH)); exit}1'

【讨论】:

  • 这将包括包含“WORD”的记录,OP想要排除它。
  • 那么如何解决这个问题,使它不会打印 WORD?
【解决方案2】:

这可能是你想要的:

$ 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,

【讨论】:

  • 是的,但是如果 WORD 在该行中出现两次? :)
  • 那么这可能会也可能不会做他想做的事,就像 WORD 在文件中的其他任何地方第二次出现,或者如果它出现在单词中间或者 .... OP 没有放一个对他的要求进行了很多思考,或者如果他有,他还没有告诉我们这些要求!无论如何,这是引用伯恩斯的一个很好的借口:-)。
  • 绝对正确,问题未充分说明。但是“从字符串 WORD 打印”需要非常松散地解释以生成“从包含 WORD 的第一行中最后一次出现的 WORD 打印”。
  • 没错,但我怀疑他的真实输入在一行上有自己的 WORD,在我们看到一些体面的要求和示例输入/输出之前,我不想花太多心思/精力。希望这会让 OP 思考......
  • 我正在寻找一个简短的解决方案,但它最后给出了WORD。您对如何修复它有任何想法:awk -v RS="WORD" 'NR>1' ORS="WORD" 如果文件中只有一个模式并且我们删除了ORS
【解决方案3】:

如果文本只有一个pattern,这个gnu awk(gnu 由于RS)将起作用:

awk -v RS="WORD" 'NR>1' file

它将作为 Eds 解决方案工作,从 WORD 之后的第一个数据开始,并将该行的其余部分和所有下一行打印到 EOF


这将在找到WORD 之后打印下一行,直到EOF
如果您需要 WORD 之后的同一行上的数据,请查看 Eds 答案。

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

【讨论】:

    【解决方案4】:

    这可能对你有用(GNU sed):

    sed '1,/WORD/{/WORD/!d;s//\n/;D}' file
    

    这将删除直到 WORD 的所有行,然后用换行符替换 WORD 并删除直到并包括换行符。其余文件正常打印。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2021-12-26
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多