如何仅注释Bash脚本中写入LogFiles.txt的echo行?
如何仅注释Bash脚本中写入LogFiles.txt的echo行?
你的核心需求是精准定位并注释所有向LogFiles.txt写入内容的echo命令行,而保留写入bills.txt的行不变。之前的sed命令之所以出错,是因为它把所有包含echo的行都加了注释前缀,又给所有LogFiles.txt加了注释后缀,没有做行级的精准匹配。
正确的Sed命令
可以用以下命令实现精准匹配:
sed -E 's/^(echo .*>>LogFiles\.txt)$/\/\*\1\*\//' samplescript.sh
如果你的系统上的sed不支持-E(扩展正则表达式),可以用兼容基础正则的写法:
sed 's/^\(echo .*>>LogFiles\.txt\)$/\/\*\1\*\//' samplescript.sh
命令逻辑解释
^和$:分别匹配行的开头和结尾,确保我们只处理整行就是目标echo命令的行,避免误匹配行内的片段(echo .*>>LogFiles\.txt):捕获整个符合条件的命令行,其中\.是转义后的点(正则中.代表任意字符,必须转义才能匹配文件名里的实际点)\/\*\1\*\//:将捕获的行替换为/*+ 原行内容 +*/,其中\/和\*是转义后的/和*(因为sed用/作为分隔符,所以需要转义)
测试效果
用你提供的示例脚本运行该命令后,会得到你期望的输出:
echo "+++++++++++++++++++++">>bills.txt echo "doing some stuff">>bills.txt /*echo "starting to execute some commands">>LogFiles.txt*/ /*echo "----------------------">>LogFiles.txt*/ ls cat someFile.txt| grep "search me" /*echo "search results found">>LogFiles.txt*/ /*echo "----------------------">>LogFiles.txt*/ echo "+++++++++++++++++++++">>bills.txt echo "doing some more stuff">>bills.txt some other commands... /*echo "finshing script execution">>LogFiles.txt*/ /*echo "----------------------">>LogFiles.txt*/
额外提示
如果需要直接修改原文件(而不是输出到终端),可以添加-i参数(注意:部分BSD版本的sed需要写成-i ''):
sed -i -E 's/^(echo .*>>LogFiles\.txt)$/\/\*\1\*\//' samplescript.sh
内容的提问来源于stack exchange,提问作者Hammad Ahmed
相关产品推荐
相关产品推荐

