Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换文本文件中的换行符和变量_Regex_Linux_Ubuntu_Awk_Sed - Fatal编程技术网

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
请在上方my
awk
代码行中附加
>临时和中压临时输入_文件
,它会将输出保存到输入_文件本身

解释:编辑代码我正在做的是,我正在使用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
更容易。