在bash中使用分隔符提取行集
我正在尝试提取bash中特定模式之间的一组行。在bash中使用分隔符提取行集,bash,Bash,我正在尝试提取bash中特定模式之间的一组行。 我的输入文件: ========= a b ven c d ========= abc def venkata sad dada ========= 我试图只提取两个===之间的行,其中包含中间的模式venkata。例如,上面的第二部分(abc…dada)。 我已经试过sed,但它并没有提供我所需要的东西 我尝试将此任务拆分为分别获取venkata上方和下方的行 使用sed-n-e'/=====,/venkata/p'从输入的开头开始,这不是我需
我的输入文件:
=========
a
b
ven
c
d
=========
abc
def
venkata
sad
dada
=========
我试图只提取两个===
之间的行,其中包含中间的模式venkata
。例如,上面的第二部分(abc…dada)。我已经试过sed,但它并没有提供我所需要的东西 我尝试将此任务拆分为分别获取
venkata
上方和下方的行
使用sed-n-e'/=====,/venkata/p'
从输入的开头开始,这不是我需要的。有什么想法吗 编辑:在
=======
之间的行数可以是任意数,venkata
可以是任意行,而不一定是中间每行可以有多个单词、数字和符号。这只是一个样本 编辑2:接受的答案接近,但给出第一次匹配的输出。这不是我想要的。
根据该问题答案中的命令,它将在找到第一个
==
时设置标志。
我需要=
就在venkata
之前,这不一定是第一个匹配项。这个答案不能帮助我解决问题使用
gnu awk
您可以这样做:
awk -v RS='={2,}\n' -v ORS= '/venkata/' file
abc
def
venkata
sad
dada
如果您没有
gnu awk
,请使用:
awk '/={2,}/{if (s && data ~ /venkata/) printf "%s", data; s=1; data=""; next} s{data = data $0 RS}' file
使用
grep
可以实现相同的功能:
cat infile | grep -A 2 -B 2 "venkata"
选项-A
和-B
分别打印多个尾随行和前导行
正如@Jan Gassen所指出的,如果您希望在匹配图案的下方和上方有相同数量的线条,您可以通过以下方式使其更加简单:
cat infile | grep -C 2 "venkata"
或者更简单:
grep-c2“venkata”文件
如果你没有gnuawk
那么使用:awk'/={2,}/{If(s&&data~/venkata/)printf“%s”,data;s=1;data=“”;next}s{data=data$0rs}文件
我没有gnuawk,我尝试了相应的解决方案。但是没有成功。它没有归还任何东西。我不清楚尝试和调试给出的解决方案的逻辑。如果您有不同的样本数据,请编辑问题,我将进一步调查。是否有多个单词的行?是的,可能有多个单词。而且它不仅限于字母表,每行可以有字母表、数字、特殊字符或所有这些字符的组合。@VenkataKrishna:您是否检查了我在下面发布的awk
解决方案?