[英]how to search for multiple lines in a file and comment those lines in bash/dash
我有一个包含内容的文件
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文件中注释一个宏。
假设您要注释以下各行:
xxx {样本测试}
狼人
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
如果多个结尾注释不打扰您,则可以使用一个简单的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
如果您想直接覆盖file.txt
请添加-i
标志。
甚至更短:
awk '/sample test/,/bewolf/' infile >outfile
下面将修改该部分,以匹配行开始,以匹配行结束,以在开头添加单个“ / *”,在末尾添加单个“ * /”。
awk -vstart=xxx -vend=bewolf '$0~start {$0="/*" $0;inmacro=1} inmacro==1 && $0~end {$0=$0 "*/";inmacro=0} {print}' infile > outfile
这可能更接近您要寻找的东西。 当然,如果您不定义变量而不是在指令中对它们进行硬编码,则可以将其缩短。
这可能对您有用:
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//\\/* & *\\//
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.