2017-02-19 1574 views
1

我想请教一下sed的2个问题。差异sed命令的sed的///“和sed ”S ###“

例如,当我试图把一个字符串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中的///“和sed “s ###”
  2. 如何看待输入只是因为它是纯粹的字符串?
+0

在bash shell和GNU sed中都给出了'hi'作为结果'a =“。\ n *。\ +”; “\ N * \ + adsdfasdf” 输入=;回声“$输入”| sed'/'$ a'/ hi/g'' ....参见https://stackoverflow.com/documentation/sed/1096/substitution#t=201702190808137883167关于使用不同分隔符的一些解释.. – Sundeep

+0

afaik,没有办法告诉sed该字符串被视为文字,你将不得不逃离元字符以及使用的分隔符 – Sundeep

回答

0

1.什么是这些命令的区别是:用sed的///“和sed ”S ###“
---在你的情况,/#是的一个分离器关键的“节”:

小号命令(如替代)可能是在sed 最重要的,有很多不同的选择。 s命令的语法是 “S /的regexp /更换/标志”。
...
/字符可以被任何给定的s命令中的任何其他单个字符统一替换。


2.如何看待输入只是因为它是纯粹的字符串?
---要展开/插值sed命令中的变量,这些变量或整个表达式应该双引号括:

set a = ".\n*.\+" 
echo "$input" | sed "s/$a/hi/g" 
-1

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

因此,现在我将分离器更改为#。这就像评论角色。

+0

已经看到,当sed分隔符设置为/并且你的模式也是包含/你需要逃避它们。通过选择不存在于模式中的不同分隔符(如|,#等),可以减少转义。 –

+0

谢谢。我终于明白了。 – TuanLaDaPoet

+0

你好,欢迎来到Stack Overflow。请不要发表评论作为答案 - 只有实际尝试回答问题的内容应该使用“发布答案”按钮发布。主持人可以将其转换为评论,但通常在此表示感谢的方式是单击您喜欢的事物旁边的向上箭头,也可以选择您最喜欢的答案旁边的绿色复选标记。 – tripleee

0

那么,你必须在输入字符串,你不用引号分隔符代替在's/'$a'/hi/g'和被解析为一个空间\n,所以你实际上2个参数传递给sed(1),你替换为只有一个参数(与\n包括在如"s#$a#hi#g"一个字符)中只有一个参数(在这种双引号包括可变取代)。在sed(1)中作为分隔符使用的字符实际上没有区别,但是您在两次调用中调用了不同的名称。