我想问两个有关sed的问题。
例如,当我尝试将字符串放在sed上时,其中包含特殊字符,例如(。 n*。 )和sed无法正常运行。
set a = ".n*.+"
set input = ".n*.+adsdfasdf"
然后执行:
echo "$input" | sed 's/'$a'/hi/g' # It will give: sed: No match
但是
echo "$input" | sed "s#${a}#hi#g" # It will run but not true
我的问题是:
- 这些命令有什么区别:sed'S///和SED" S ###"
- 如何像纯粹的字符串一样对待输入?
1。这些命令有什么区别:sed's///'和sed" s ###"
---在您的情况下,/
或#
是至关重要的"部分"的分离器:
s 命令(如替代)可能是SED中最重要的 并且有很多不同的选择。s命令的语法是 ‘ s/regexp/replacement/flags ’。
...
/字符可以被任何给定的S命令中的任何其他单个字符统一替换。
2。如何像纯粹是字符串一样处理输入?
---要在 sed
命令中展开/插值变量,这些变量或整个表达式应用 double Quotes 封闭:
set a = ".n*.+"
echo "$input" | sed "s/$a/hi/g"
好吧,您在输入字符串中有一个n
,您可以在's/'$a'/hi/g'
中无引用定界符替换,并将其解析为一个空间,因此您实际上通过了两个 parameters到sed(1)
,您仅在"s#$a#hi#g"
中的一个参数中替换为一个参数(包含n
作为一个字符)(其中双引号包括可变替换)。实际上,在sed(1)
中用作定界符的字符没有区别,但是您在两个呼叫中以不同的方式称其为不同。
最后,我发现分隔符必须与字符串中的任何字符不同!否则会导致错误!
因此,现在我将将分离器更改为#。就像评论字符。