打印2个匹配字符之间的可变行

时间:2018-02-21 07:37:27

标签: shell awk sed

cat massive_data.txt
Will
12
123
1234
12345
/>

Liu
23
34
/>

Will
1234
12345
/>

Will
1234
12345
.
.
.

在上面的文字中,我想要获取每个" Will"之间的界限。  和" />",忽略其他。但是间隙线的数量是可变的, 我使用了以下命令,但得到了不准确的结果

sed -n '/\<Sector/,/\/\>/p' massive_data.txt
Will
12
123
1234
12345
/>

Will
1234
12345
/>

Will
1234
12345
.
.
.

我如何使用&#34; sed&#34;或者&#34; awk&#34;解决问题? 我希望结果如下:

Will
12
123
1234
12345
/>

Will
1234
12345
/>
.
.
.

3 个答案:

答案 0 :(得分:2)

您可以像这样使用awk

awk '$1 == "Will"{p=1} p{data = data $0 RS} $1 == "/>"{print data; p=0; data=""}' file

Will
12
123
1234
12345
/>


Will
1234
12345
/>

<强>解释

  • $1 == "Will"{p=1}:当第一列为&#34时设置标记p=1;将&#34;
  • p{data = data $0 RS}:如果p==1,请继续将每行附加到变量data
  • $1 == "/>"{print data; p=0; data="":如果第一列为/>,则打印data并重置pdata个变量。

如果/>后面有空行,那么您也可以使用awk这样的字符:

awk -v ORS='\n\n' -v RS= '/^Will/ && /\/>$/' file

答案 1 :(得分:1)

$ awk 'BEGIN{RS=""}/^Will/&&/\/>/' file
Will
12
123
1234
12345
/>
Will
1234
12345
/>

RS将记录拆分为空行。脚本打印以Will开头并以/>结尾的记录。

答案 2 :(得分:0)

基于我的理解:

cat filename | sed -n&#39; / Will /,/&gt; / p&#39; | grep -v&#34; /&gt;&#34;

输出:

Will
12
123
1234
12345
Will
1234
12345
Will
1234
12345