Linux替换为包含双引号的变量

时间:2017-10-12 20:27:16

标签: linux bash unix awk sed

我已阅读以下内容:

我了解到我可以使用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

3 个答案:

答案 0 :(得分: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中使用shell变量 gsub(/STRING/,var,$0):使用$0全局替换整个记录var中所有“STRING”的出现

特殊情况:“如果您的var中有&”,请在该行的开头说明,那么gsub会产生&的问题{1}}具有特殊含义,而是指代匹配的文本。

为了解决这种情况,我们要逃离&,如下所示:

$ 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

答案 1 :(得分:1)

问题不在于引号。你错过了&#34; s&#34;命令,引导describe(function () { // these tests will be skipped }); describe.only(function () { // these tests will run }) sed视为行地址,将/STRING/的值作为在匹配行上执行的命令。此外,$var1还有未转义的换行符和$var1字符,这会在替换中造成麻烦。所以添加&#34; s&#34;,并转义/中的相关字符:

$var1

...但实际上,@ batMan的回答(使用var1escaped="$(echo "$var1" | sed 's@[\/&]@\\&@; $ !s/$/\\/')" echo "STRING" | sed "s/STRING/$var1escaped/" )可能是更好的解决方案。

答案 2 :(得分: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等。