Regex 替换文本文件中的换行符和变量
我有以下文件Regex 替换文本文件中的换行符和变量,regex,linux,ubuntu,awk,sed,Regex,Linux,Ubuntu,Awk,Sed,我有以下文件~/hello.txt: qwe asd qwe bash "$HOME/byobu.sh" bash "$HOME/byobu.sh" # asd yxc asd 如何替换以换行符和变量开头的字符串,以使文件产生: qwe asd qwe # bash "$HOME/byobu.sh" bash "$HOME/byobu.sh" # asd yxc asd i、 e.将第二个字符串的第一个匹配项替换为其注释版本。 正在尝试以下命令: byobu_line='bash "$HOM
~/hello.txt
:
qwe asd qwe
bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
如何替换以换行符和变量开头的字符串,以使文件产生:
qwe asd qwe
# bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
i、 e.将第二个字符串的第一个匹配项替换为其注释版本。
正在尝试以下命令:
byobu_line='bash "$HOME\/byobu.sh"'
sed -i '0,/\n'"$byobu_line"'/ s/\n'"$byobu_line"'/\n# '"$byobu_line"'/' ~/hello.txt
使文件保持不变
不带sed的解决方案也可接受
注意:此处的换行符\n
必须匹配并由其自身替换,因为如果我在没有它的情况下再次运行它,将导致不需要的结果
qwe asd qwe
# # bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
如果您对
awk
没有问题,请尝试以下内容
byobu_line='bash "$HOME/byobu.sh"'
awk -v var="$byobu_line" '$0 == var && !found{$0="#"$0;found=1} 1' Input_file
编辑:为避免扩展
$HOME
我想出了一个主意,请尝试以下内容,我会在某个时候(吃过晚饭后:)添加解释
以下是输入_文件:
cat file
qwe asd qwe
bash "$HOME/byobu.sh"
bash "$HOME/byobu.sh"
# asd yxc asd
以下是脚本:
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
请在上方myawk
代码行中附加>临时和中压临时输入_文件
,它会将输出保存到输入_文件本身
解释:编辑代码我正在做的是,我正在使用shell的参数扩展创建名为byobu\u line\u new
的变量,该变量没有$
。现在,当相同的变量被传递到var
变量中的awk
时,在读取BEGIN
中的输入文件之前,第一节再次使用替换来获得$
。这只是为了消除变量扩展的影响(作为一种解决方法)
对于
awk
code:我已将shell变量byobu_line_new
传递给名为var
的awk
变量,然后在BEGIN
部分中,我用变量中的$HOME
替换HOME(我之前已删除了上述变量),现在,如果$0
(当前行)等于var
,并且未设置变量found
,则当输入文件获取读取检查条件时(这只会发生在第一次匹配时,因为当找到var==$0
的匹配时,意味着在第行中找到您的shell变量,然后将变量found
设置为1,所以下次此条件将不为真)。然后提及1
将从输入文件打印编辑/未编辑的行(由于awk
使用的是模式方法,然后是动作,因此我通过提到1使条件变为真实,默认情况下不会打印行).您尝试使用的sed
非常接近。表单0、/match/s/find/replace/
的使用是正确的,但您需要稍微修改它,如下所示:
sed '0,/^bash\ "\/home\/david\/byobu.sh"$/s/^bash\ "\/home\/david\/byobu.sh"$/# bash\ "\/home\/david\/byobu.sh"$/' file
使用0,addr2
会导致sed
以的“匹配的第一个地址”状态开始
,因此当找到addr2
时,表达式将位于其范围的末尾,进行一次替换,然后不再匹配,从而仅具有匹配第一次出现的效果
您误以为需要搜索以'\n'
开头的行。sed
不是这样工作的。行不是以'\n'
字符开头的
在表达式bash”/home/david/byobu.sh“
中,应分别以'^'
和'$”
锚定开头和结尾,以便不匹配较大行中包含的较小的子字符串
对于替换,您只需在带有s/^bash\/home\/david\/byobu.sh“$/\bash\/home\/david\/byobu.sh”$//home\/david\/byobu.sh“$/
的行开头插入。出于同样的原因,您需要锚定0,/addr2/
术语,您还应该充分描述和锚定替换术语
总而言之,你可以做到:
$ sed '0,/^bash\ "\/home\/david\/byobu.sh"$/s/^bash\ "\/home\/david\/byobu.sh"$/# bash\ "\/home\/david\/byobu.sh"$/' file
qwe asd qwe
# bash "/home/david/byobu.sh"
bash "/home/david/byobu.sh"
# asd yxc asd
这提供了您预期的结果。在awk
中,这种事情通常比sed
更容易。