我有一个包含内容的文件
abc dbw ;\
xxx{ sample test }
bewolf \
bewolf
test
我需要检查
xxx{ sample test }
bewolf
并注释掉这些行
/*xxx{ sample test }
bewolf*/
我尝试使用grep
但grep
搜索字符串。由于Dash脚本没有数组,因此它的工作更加艰难。
我试图获取起始和结束索引,以便我可以使用head
和tail
删除该部分。
欢迎使用sed
和awk
等其他任何想法。
更一般地说,我需要使用Bash脚本在C文件中注释一个宏。
答案 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//\/* & *\//