相关文章推荐
老实的松鼠  ·  Using X-ray ...·  11 月前    · 
性感的小摩托  ·  vue3 + computed ...·  1 年前    · 

but how to print the file from the string WORD until the end of file not include the string WORD?

2 个评论
梦幻般的答案 here 包括对你的问题的回答。
这样就不会打印到字符串WORD,而是打印到包含字符串WORD的那一行的末尾。发布一些样本输入和预期输出,如果在你的真实输入中可能的话,将 "WORD "放在一行的中间。还要考虑如果NEWORDER出现在文件中间,你希望如何处理它--那中间的WORD是否与你的字符串匹配?
linux
bash
awk
sed
solaris
maihabunash
maihabunash
发布于 2015-03-17
4 个回答
rici
rici
发布于 2015-03-17
已采纳
0 人赞同

正如Etan Reisner在评论中所说的那样,有一本很好的范围模式的食谱在 这个答案 .但最简单的方法是从一个模式匹配到一个文件的结尾。

awk '/WORD/,0' file  

为了从包含图案的那一行开始打印,我们可以这样做。

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

为了同时打印第一行中与WORD后面的WORD相匹配的部分,只需要修改最后一个动作,但为了设置RSTART和RLENGTH,用对match的明确调用代替正则表达式是很方便的。

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

范围模式的形式是expression,expression,其含义是从与第一个表达式匹配的第一行到与最后一个表达式匹配的第一行,包括在内。这个范围会重复进行,直到文件被完全处理。

在这些例子中,第二个表达式总是评估为0(false),所以范围永远不会终止,一旦模式成功,所有行都被匹配。

同样地,解决 "打印所有行 "的另一种方法是untila pattern "将是如下的,尽管它的效率较低,因为它读取了整个文件。

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

另外,如果目标是只打印模式的实例(而不是包含该模式的完整行,我们可以对原程序进行简单的修改。

awk 'match($0, /WORD/){print(sub($0,1,RSTART+RLENGTH)); exit}1'
    
这将包括含有 "WORD "的记录,OP想把它排除在外。
那么如何解决这个问题,使其不打印WORD?
Ed Morton
Ed Morton
发布于 2015-03-17
0 人赞同

这可能是你想要的。

$ 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,
    
rici
是的,但如果WORD在行中出现两次?)
那么这可能会也可能不会达到他的要求,就像如果WORD在文件的其他地方第二次出现,或者如果它出现在单词中间,或者....。OP并没有对他的要求进行深思熟虑,或者说,如果他有的话,他还没有告诉我们这些要求。不管怎么说,这都是一个引用伯恩斯的好借口 :-)。
rici
绝对正确,这个问题没有得到充分的说明。但 "从字符串WORD中打印 "需要非常宽泛地解释为产生 "从包含WORD的第一行中最后出现的WORD中打印"。
确实如此,但我怀疑他真正的输入有WORD在一条线上,在我们看到一些像样的要求和输入/输出样本之前,我不想在这方面投入太多的思考/努力。希望这能引起OP的思考......
我在看一个简短的解决方案,但它在最后给出了 WORD 。 你有什么办法来解决这个问题吗。 awk -v RS="WORD" 'NR>1' ORS="WORD" 。如果文件中只有一个模式,并且我们删除了 ORS ,那么它就会起作用。
Jotne
Jotne
发布于 2015-03-17
0 人赞同

如果文本中只有一个 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