2017-10-12 189 views
1

我已阅读以下内容:的Linux替换为变量包含双引号

我了解到,我可以使用sed "s/STRING/$var1/g"来替换字符串变量的内容。但是,我很难找到如何替换包含双引号,括号和感叹号的变量。

然后,希望能够逃脱报价,我试图通过sed 's/\"/\\\"/g'管道我的结果,这给了我另一个错误sed: -e expression #1, char 7: unknown command: E'。我希望能够逃避有问题的字符,然后做可变更换:sed "s/STRING/$var1/g"。但是我也无法达到那么远。

我想你们可能知道一个更好的方法来用包含引号的变量替换字符串。

FILE1.TXT:

Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 

变量:

var1=$(cat file1.txt) 

实施例:

echo "STRING" | sed "s/STRING/$var1/g" 

希望的输出:

Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 
+0

'sed'不是此替换的正确工具。 – anubhava

+0

@anubhava我明白了。感谢Anubhava的建议。我愿意接受任何有效的工作。也会尝试做更多的研究。编辑问题以反映这一点。 – DomainsFeatured

+0

@batMan是的,这就是主意。保持变量中的数据相同。我想用'$ var1'的内容替换'STRING'。这就是我卡住的地方。这只是一个极简主义的例子。 – DomainsFeatured

回答

2

使用AWK

$ echo "STRING" | awk -v var="$var1" '{ gsub(/STRING/,var,$0); print $0}' 
Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 

-v var="$var1":要在AWK
gsub(/STRING/,var,$0)使用shell变量:要全局替代品在整个记录$0 “STRING” 的所有出现与var

特殊情况:“如果你的var&在它“说在线的开始,那么它会产生问题gsub因为&有一个特殊的含义,而是指相应的文字。

为了应对这种情况,我们已经逃离&如下:

$ echo "STRING" | awk -v var="$var1" '{ gsub(/&/,"\\\\&",var); gsub(/STRING/,var,$0);print $0}' 
&Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 
+0

谢谢@batMan。这对我有用。你是我的英雄。 – DomainsFeatured

+1

@DomainsFeatured::) – batMan

+0

在很多情况下,这是行不通的。 。例如。如果'$ var1'在任何地方都包含'&'字符。 – anubhava

2

的问题不是引号。您错过了“s”命令,导致sed/STRING/视为行地址,将$var1作为在匹配行上执行的命令。此外,$var1还有未换行的换行符和/字符,这会在替换中造成麻烦。所以加了“S”和逃避相关的字符$var1

var1escaped="$(echo "$var1" | sed '[email protected][\/&]@\\&@; $ !s/$/\\/')" 
echo "STRING" | sed "s/STRING/$var1escaped/" 

...但实际上,@蝙蝠侠的答案(使用awk)可能是一个更好的解决方案。

+0

Ooops。我用“s”来运行它,但它也不起作用。你的答案确实有用!有用于学习目的的背景信息很好。你逃脱那些其他角色的技能是高超的。 – DomainsFeatured

+0

@ Gordon-Davisson:这真的很有帮助。你能解释一下你的第二部分,即'$!s/$/\\ /' – batMan

+0

@batMan这部分转义了新行*,除了文件末尾的那个(/字符串)。坦率地说,这相当混乱。 'echo'在变量的末尾添加一个换行符,在'sed'中,'$!'地址适用于文件的最后一行,而's/$/\\ /'在行尾添加一个反斜杠(反斜杠加倍,因为它必须逃避自己......)。请注意,'$'在这里扮演着两种不同的角色 - 在线路地址中它匹配最后一行;在替代模式中,它匹配行的末尾。然后,在完成之后,'$()'删除最后一个换行符。 –

1

这里是一个awk命令是获取来自可能包括所有种类的特殊字符,如&\等文件文本对被替换:

awk -v pat="STRING" 'ARGV[1] == FILENAME { 
    # read replacement text from first file in arguments 
    a = (a == "" ? "" : a RS) $0 
    next 
} 
{ 
    # now run a loop using index function and use substr to get the replacements 
    s = "" 
    while(p = index($0, pat)) { 
     s = s substr($0, 1, p-1) a 
     $0 = substr($0, p+length(pat)) 
    } 
    $0 = s $0 
} 1' File1.txt <(echo "STRING") 

为了能够处理所有这种命令可以避免任何基于正则表达式的函数。我们使用基于纯文本的功能,例如indexsubstr等。

+1

这真是太棒了!但是,非常有用!谢谢@Anubhava :-) – DomainsFeatured