0

我有一个 bash 脚本,它有大约 2000 行代码,在这个脚本的各个行中,脚本将一些状态消息写入日志文件,即 LogFiles.txt,bills.txt 我想为所有人评论(搜索并替换文本)仅在 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

所需的输出:

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 注释回声。

4

3 回答 3

1

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

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 '>>'
  }
}
于 2018-05-29T17:14:11.927 回答
0

以下简单awk可能会对您有所帮助。

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

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

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

sed -i.bak '/LogFiles.txt$/s/^/##/'  Input_file
于 2018-05-29T09:47:17.193 回答
0

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

: ${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

而不是注释掉这些行。

于 2018-05-29T17:27:17.000 回答