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
/>
.
.
.
答案 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
并重置p
和data
个变量。如果/>
后面有空行,那么您也可以使用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