差异 sed 命令 sed 's///' 和 sed "s###"



我想问两个有关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

我的问题是:

  1. 这些命令有什么区别:sed'S///和SED" S ###"
  2. 如何像纯粹的字符串一样对待输入?

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)中用作定界符的字符没有区别,但是您在两个呼叫中以不同的方式称其为不同。

最后,我发现分隔符必须与字符串中的任何字符不同!否则会导致错误!

因此,现在我将将分离器更改为#。就像评论字符。

最新更新