在字符串中找到模式后注释 bash 行



我有一个bash脚本,它有大约2000行代码,在这个脚本中,脚本在各个行上将一些状态消息写入日志文件,即LogFiles.txt,bills.txt 我只想评论(搜索和替换文本(在日志文件中写入状态消息的所有行.txt

示例脚本文件:

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

期望输出:

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*/

到目前为止,我已经使用了以下命令,但结果不好:

sed -e 's/echo//*echo/gI' -e 's/LogFiles.txt/LogFiles.txt*//gI' samplescript.sh

此命令生成的结果:

/*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*/
some other commands...
/*echo "finshing
script
execution">>LogFiles.txt*/
/*echo "----------------------">>LogFiles.txt*/

当 sed -e 命令的第一部分将所有回声替换为/*echo 时,这里会出现问题,这是一种错误的方法,因为我不需要为 bills .txt 注释回显。

在 bash 中使用: ''语法进行多行注释,如 @Aserre 所指出的,使用 sed:

sed -r -e "/^echo/ {/>>/ bb; :a; N; />>/! ba; :b; />>LogFiles.txt/I {s/^echo/: ' echo/; s/(>>.*)$/1 '/}}" samplescript.sh

也可以使用-i直接写入脚本文件。


Sed 命令说明:

/^echo/ {              # in a line that starts with 'echo'
/>>/ bb              # if also already contains '>>' jump forward to 'b' label
:a                   # 'a' label to jump to
N                    # read next line and add it to pattern space
/>>/! ba             # if pattern space not contains '>>' jump back to 'a' label
:b                   # 'b' label to jump to
/>>LogFiles.txt/I { # now if pattern space contains '>>LogFiles.txt' case insensitive
s/^echo/: ' echo/  # add open comment before 'echo'
s/(>>.*)$/1 '/    # add close comment at the end of the line with '>>'
}
}

遵循简单的awk可能会在这里为您提供帮助。

awk '/LogFiles.txt$/{$0="##"$0} 1'  Input_file

如果您想将输出存储到Input_file本身中,请在上面的代码中附加> temp_file && mv temp_file Input_file

解决方案 2nd:sed与实际Input_file的备份一起使用。

sed -i.bak '/LogFiles.txt$/s/^/##/'  Input_file

不要使用注释进行配置。重写脚本以允许配置某些块。

: ${LOG_FILE:=LogFile.txt}
{
echo "+++++++++++++++++++++"
echo "doing some stuff"
} >> bills.txt
{
echo "starting
to execute some commands"
echo "----------------------"
} >> "$LOG_FILE"
ls 
cat someFile.txt| grep "search me"
{
echo "search results found"
echo "----------------------"
} >> "$LOG_FILE"
{
echo "+++++++++++++++++++++"
echo "doing some more stuff"
} >> bills.txt
some other commands...
{
echo "finshing 
script
execution"
echo "----------------------"
} >> "$LOG_FILE"

现在,如果要禁用对日志文件的写入,只需使用

LOG_FILE=/dev/null ./sampleScript.sh

而不是注释掉这些行。

最新更新