如何在文件中搜索多行并在bash / dash中注释这些行

时间:2012-06-01 10:40:38

标签: linux unix sed awk grep

我有一个包含内容的文件

abc dbw ;\
xxx{ sample test } 
bewolf \
bewolf 
test

我需要检查

 xxx{ sample test }
 bewolf

并注释掉这些行

/*xxx{ sample test }
bewolf*/

我尝试使用grepgrep搜索字符串。由于Dash脚本没有数组,因此它的工作更加艰难。

我试图获取起始和结束索引,以便我可以使用headtail删除该部分。

欢迎使用sedawk等其他任何想法。

更一般地说,我需要使用Bash脚本在C文件中注释一个宏。

5 个答案:

答案 0 :(得分:0)

假设您要评论具有以下内容的行:

xxx {样本测试}
bewolf

awk '{if($0~/bewolf/ || $0~/xxx{ sample test }/)print "//"$0;else print}'

<强>测试

    > awk '{if($0~/bewolf/ || $0~/xxx{ sample test }/)print "//"$0;else print}' temp
    abc dbw ;\
//    xxx{ sample test } 
//    bewolf \
//    bewolf 
    test

答案 1 :(得分:0)

如果多个结束评论不打扰您,您可以使用这样的简单sed

sed -e "s%^xxx{ sample test }$%\/\*&\*\/%" -e "s%^bewolf$%\/\*&\*\/%" file.txt

输入:

abc dbw ;\
xxx{ sample test }
bewolf \
bewolf
test

输出:

abc dbw ;\
/*xxx{ sample test }*/
bewolf \
/*bewolf*/
test

如果您想直接覆盖-i,请添加file.txt标记。

答案 2 :(得分:0)

更短:

awk '/sample test/,/bewolf/' infile >outfile

答案 3 :(得分:0)

以下内容将修改以行匹配开头并以行匹配结尾的部分,以在开头添加单个“/ *”,在结尾添加单个“* /”。

awk -vstart=xxx -vend=bewolf '$0~start {$0="/*" $0;inmacro=1} inmacro==1 && $0~end {$0=$0 "*/";inmacro=0} {print}' infile > outfile

这可能更接近您所寻找的内容。当然,如果你没有定义变量,你可以把它缩短,而不是在指令中硬编码。

答案 4 :(得分:0)

这可能对您有用:

 sed '/^xxx{ sample test }/!b;:a;$b;N;/.*\nbewolf *$/!ba;s//\/* & *\//' file

说明:

  • 关注从xxx{ sample test }开始的行。 /^xxx{ sample test }/!b
  • 创建循环标签:a
  • 如果文件结束纾困。 $b
  • 获取下一行。 N
  • 检查以bewolf结尾的行,如果没有得到下一行,即循环到a/.*\nbewolf *$/!ba
  • 用注释环绕图案空间并打印出来。 s//\/* & *\//