替换文本文件中的换行符和变量

Sim*_*mon 3 regex linux ubuntu awk sed

我有以下文件~/hello.txt

qwe asd qwe
bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
Run Code Online (Sandbox Code Playgroud)

如何替换以换行符和变量开头的字符串,以便文件将导致:

qwe asd qwe
# bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
Run Code Online (Sandbox Code Playgroud)

即将第二个字符串的第一次出现替换为其注释版本。尝试以下命令:

byobu_line='bash "$HOME\/byobu.sh"'
sed -i '0,/\n'"$byobu_line"'/ s/\n'"$byobu_line"'/\n# '"$byobu_line"'/' ~/hello.txt
Run Code Online (Sandbox Code Playgroud)

保持文件不变。

没有sed的解决方案也被接受。

注意\n这里的换行符需要自己匹配和替换,因为如果我没有它第二次运行它,它会导致不需要的结果

qwe asd qwe
# # bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
Run Code Online (Sandbox Code Playgroud)

Rav*_*h13 5

如果您对awk.

byobu_line='bash "$HOME/byobu.sh"'
awk -v var="$byobu_line" '$0 == var && !found{$0="#"$0;found=1} 1' Input_file
Run Code Online (Sandbox Code Playgroud)

编辑:为了避免扩展$HOME 我想出了一个想法,请您尝试以下操作,稍后会添加解释(在我吃完晚饭后:))。

这是 Input_file:

cat file
qwe asd qwe
bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
Run Code Online (Sandbox Code Playgroud)

这是脚本:

cat file.ksh
HOME="/home/ubuntu"    ##Setting value for testing purposes, to make sure they are NOT getting expanded.
byobu_line='bash "$HOME/byobu.sh"'
byobu_line_new=$(echo "${byobu_line//$/}")
awk -v var="$byobu_line_new" 'BEGIN{sub(/HOME/,"$&",var)} $0 == var && !found{$0="#"$0;found=1} 1' Input_file
Run Code Online (Sandbox Code Playgroud)

请附加> temp && mv temp Input_file在我awk上面的代码行中,它会将输出保存到 Input_file 本身。

说明:编辑代码我正在做的是,我正在使用 shell 的参数扩展来创建名为byobu_line_newwhich DO NOT have 的变量$。现在,当相同的变量被传递给awkinvar变量并且在读取 Input_fileBEGIN部分之前,我再次使用替换$在 HOME 之前获取。这只是为了消除变量扩展的影响(作为一种解决方法)。

对于awk代码:我已将 shell 变量传递byobu_line_newawk变量 named var,然后在BEGIN部分中我将 HOME 替换为$HOMEin 变量(我之前删除了上面提到的),现在当 Input_file 正在获取读取检查条件 if $0(current line) is equal to varand variable foundis NOT SET(这只会在第一次匹配时发生,因为当var==$0找到匹配项时意味着您的 shell 变量在行中找到,然后将变量设置found为 1,因此下次此条件不会为 TRUE)。然后提及1将从 Input_file 打印已编辑/未编辑的行(因为awk 适用于模式的方法,然后是操作,我通过提及 1 使条件为真,因此默认情况下不会打印行)。