我想问两个关于sed的问题。
例如,当我尝试将字符串放入包含特殊字符(如\。\ n *。+)的sed时,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
我的问题是:
答案 0 :(得分:0)
1。这些命令有什么区别:sed's ///'和sed“s ###”
---在您的情况下,/
或#
是关键“部分”的分隔符:
s 命令(如替代品)可能是sed中最重要的 并有很多不同的选择。 s命令的语法是 “的 S /的regexp /更换/标志 强>”。
...
/ 字符可以由任何给定s命令中的任何其他单个字符统一替换。
2。如何将输入视为纯粹的字符串?
---要在sed
命令中扩展/插入变量,那些变量或整个表达式应该用双引号括起来:
set a = ".\n*.\+"
echo "$input" | sed "s/$a/hi/g"
答案 1 :(得分:0)
嗯,输入字符串中有一个\n
,你在's/'$a'/hi/g'
中没有引号分隔符替换它并被解析为空格,所以实际上传递了两个参数到sed(1)
并且您只在\n
中的一个参数(其中双引号包括变量替换)中仅替换一个参数("s#$a#hi#g"
包含为一个字符)。在sed(1)
中用作分隔符的字符实际上没有区别,但您在两次调用中对它的调用方式不同。
答案 2 :(得分:-1)
最后,我发现分隔符必须与字符串中的任何字符不同! 否则会导致错误!
因此,现在我将分隔符更改为#。它就像评论角色一样。