Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 读取特定字符串的文件,并在匹配后读取行_String_Awk - Fatal编程技术网

String 读取特定字符串的文件,并在匹配后读取行

String 读取特定字符串的文件,并在匹配后读取行,string,awk,String,Awk,我有一个文件,看起来像: AA 2 3 4 CCC 111 222 333 XXX 12 23 34 我正在寻找awk命令,从上面搜索字符串“CCC”,并打印在“CCC”之后出现的所有行,但在我到达“XXX”后立即停止读取 一个非常简单的命令为我执行读取操作,但不会在XXX处停止 awk '$0 == "CCC" {i=1;next};i && i++' c.out 你能试试下面的吗 awk '/CCC/{flag=1;next}

我有一个文件,看起来像:

AA  
2   
3  
4  
CCC  
111  
222  
333  
XXX  
12  
23  
34
我正在寻找awk命令,从上面搜索字符串“CCC”,并打印在“CCC”之后出现的所有行,但在我到达“XXX”后立即停止读取

一个非常简单的命令为我执行读取操作,但不会在XXX处停止

awk '$0 == "CCC" {i=1;next};i && i++' c.out

你能试试下面的吗

awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
解决方案1:使用
sed

sed -n '/CCC/,/XXX/p'  Input_file
第二种解决方案:使用
awk

awk '/CCC/{flag=1} flag; /XXX/{flag=""}'  Input_file
解决方案3:如果您想从字符串
CCC
打印到
XXX
而不是这些字符串,请执行以下操作

awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file

你能试试下面的吗

awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
解决方案1:使用
sed

sed -n '/CCC/,/XXX/p'  Input_file
第二种解决方案:使用
awk

awk '/CCC/{flag=1} flag; /XXX/{flag=""}'  Input_file
解决方案3:如果您想从字符串
CCC
打印到
XXX
而不是这些字符串,请执行以下操作

awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
“在这和那之间做点什么”可以通过以下方法轻松解决:

但这并不完全是你所要求的。您想在
CCC
之后打印所有内容,并在
XXX
上退出(停止阅读)。这意味着

awk '/XXX/{exit};f;/CCC/{f=1}'
“在这和那之间做点什么”可以通过以下方法轻松解决:

但这并不完全是你所要求的。您想在
CCC
之后打印所有内容,并在
XXX
上退出(停止阅读)。这意味着

awk '/XXX/{exit};f;/CCC/{f=1}'

永远不要使用“普通awk风格的解决方案”。始终使用旗帜。当你使用一个范围表达式时,它需要一个完全重写或重复的条件,只要你的需求有最小的变化(例如,不打印范围的结尾,现在就是这样)。@EdMorton好的,我将重新措辞:-)但是当需求在这方面发生变化时,你所做的一切都是“重写”一个不需要动脑筋的事情。(反正我大多数时候只使用一次awk模式)。人们真正要做的是将其重写为
/CCC/,/XXX/{if(!/XXX/)print}
,因为他们希望在现有的基础上进行构建,而不是将其废弃,并以正确的方式编写,只列出一次标志和每个条件。然后,他们有了另一个需求变化,并再次增加了混乱。我看过太多次了。如果你只是不使用范围表达式,那么你就永远不会落入这个陷阱。@EdMorton关于
NR==2,NR==4的情况呢?我不会这么做。我会做
NR==2{f=1}f;NR==4{exit}'
。除了我之前所说的,对于任何大小的输入文件,如果效率很重要,那么这将比NR==2,NR==4更有效。永远不应该使用“普通awk风格的解决方案”。始终使用旗帜。当你使用一个范围表达式时,它需要一个完全重写或重复的条件,只要你的需求有最小的变化(例如,不打印范围的结尾,现在就是这样)。@EdMorton好的,我将重新措辞:-)但是当需求在这方面发生变化时,你所做的一切都是“重写”一个不需要动脑筋的事情。(反正我大多数时候只使用一次awk模式)。人们真正要做的是将其重写为
/CCC/,/XXX/{if(!/XXX/)print}
,因为他们希望在现有的基础上进行构建,而不是将其废弃,并以正确的方式编写,只列出一次标志和每个条件。然后,他们有了另一个需求变化,并再次增加了混乱。我看过太多次了。如果你只是不使用范围表达式,那么你就永远不会落入这个陷阱。@EdMorton关于
NR==2,NR==4的情况呢?我不会这么做。我会做
NR==2{f=1}f;NR==4{exit}'
。除了我之前所说的,对于任何大小的输入文件来说,效率都比
NR==2,NR==4
有效得多。我本以为
flag=0
会对应于
flag=1
,所以我很好奇为什么
flag=”“
会突然将一个整数变成一个字符串呢,如果脚本应该停止读取,则肯定
flag=0;退出
?我本以为
flag=0
会与
flag=1
相对应,所以我很好奇为什么
flag=”“
会突然将一个整数变成一个字符串?而且,如果脚本应该停止读取,那么肯定
flag=0;退出