我已阅读以下内容:
我了解到我可以使用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 :(得分: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")
为了能够正确处理所有类型的特殊字符,此命令可以避免任何基于正则表达式的函数。我们使用基于纯文本的功能,例如index
,substr
等。