如何使用shell脚本查找next []并注释它们之间的所有行?

时间:2016-08-16 10:18:17

标签: bash shell

我试图使用Shellscript评论一组行。

$>cat abc.txt
[entry1]
abcd
efgh
ijkl
mnop

[entry2]
abcd
efgh
ijkl
mnop
qust

[entry3]
abcd
efgh
ijkl
mnop
qrst
uvwx
yz

[entry4]
...
...
...
...

从上面的文件中,我想找到[entry2]并注释[entry2]到[entry3]之间的所有行 注意:条目之间的行数不相同。

我想要输出如下..

$>cat abc.txt
[entry1]
abcd
efgh
ijkl
mnop

#[entry2]
#abcd
#efgh
#ijkl
#mnop
#qust

[entry3]
abcd
efgh
ijkl
mnop
qrst
uvwx
yz

[entry4]
...
...
...
...

我认为我们可以用sed做到这一点。但不确定确切的用法。

有人可以建议吗?

2 个答案:

答案 0 :(得分:2)

正如您猜测的那样,sed -E '/^\[entry2\]/,/^$/s/^(.)/#\1/' file [entry1] abcd efgh ijkl mnop #[entry2] #abcd #efgh #ijkl #mnop #qust [entry3] abcd efgh ijkl mnop qrst uvwx yz [entry4] ... ... ... ... 是您的朋友。您可以在模式之间匹配文本以实现您想要的效果。

/pattern1/,/pattern2/

工作原理

  • s匹配模式之间的文本,包括模式
  • 后面的命令.此处适用于所有此类行。
  • 现在,由于您不需要注释空白行,我们需要检查至少一个非空白字符的行(请注意完成此操作的^)。
  • ()匹配行的开头
  • \1用于分组字符,[]用于替换部分以替换组
  • 现在一起阅读这些内容

注意

[在sed中有特殊含义,它们代表字符范围。要搜索文字]\[,您需要逃避它们 - 即{{1}} - 正如我们在此处所做的那样。

答案 1 :(得分:0)

awk ' /^\[entry2\]/ {flag=1} /^\[entry3\]/{flag=0} flag { $0="#"$0}1' entry
[entry1]<br>
abcd<br>
efgh<br>
ijkl<br>
mnop<br><br>

#[entry2]<br>
#abcd<br>
#efgh<br>
#ijkl<br>
#mnop<br>
#qust<br><br>
#
[entry3]<br>
abcd<br>
efgh<br>
ijkl<br>
mnop<br>
qrst<br>
uvwx<br>
yz<br>

[entry4]
...
...
...
...