Linux 差异sed命令sed';s//';及sed";s###;
我想问两个关于sed的问题 例如,当我试图将包含特殊字符(..\n*+)的字符串放入sed时,sed无法正常运行Linux 差异sed命令sed';s//';及sed";s###;,linux,unix,sed,Linux,Unix,Sed,我想问两个关于sed的问题 例如,当我试图将包含特殊字符(..\n*+)的字符串放入sed时,sed无法正常运行 set a = ".\n*.\+" set input = ".\n*.\+adsdfasdf" 然后执行: echo "$input" | sed 's/'$a'/hi/g' # It will give: sed: No match 但是 我的问题是: 这些命令之间的区别是什么:sed's//'和sed “s###” 如何像对待纯字符串一样对待输入 一,。这些命令之间有什么区
set a = ".\n*.\+"
set input = ".\n*.\+adsdfasdf"
然后执行:
echo "$input" | sed 's/'$a'/hi/g' # It will give: sed: No match
但是
我的问题是:
---在您的情况下,
/
或#
是关键“部分”的分隔符:
s命令(如在substitute中)可能是sed中最重要的命令
而且有很多不同的选择。s命令的语法为
“s/regexp/replacement/flags”。…
/字符可统一替换为任何给定s命令中的任何其他单个字符
二,。如何像对待纯字符串一样对待输入?
---要在
sed
命令中展开/插入变量,这些变量或整个表达式应该用双引号括起来:
set a = ".\n*.\+"
echo "$input" | sed "s/$a/hi/g"
最后,我发现分隔符必须与字符串中的任何字符都不同! 否则会导致错误
因此,现在我将分隔符更改为#。它类似于注释字符。好吧,输入字符串中有一个
\n
,在's/'$a'/hi/g'
中不使用引号分隔符进行替换,并被解析为一个空格,因此实际上将两个参数传递给sed(1)
,并且只替换为一个参数(将\n
作为一个字符包含在“s#a#hi#g”
中的一个参数中)(其中双引号包括变量替换)。在sed(1)中用作分隔符的字符实际上没有区别
,但您在这两个调用中对其进行了不同的调用。在bash shell和GNU seda=“.\n*\+”input=“.\n*\+adsdfasdf”echo“$input”上都为我提供了hi
| sed's/'$a'/hi/g'
…有关使用不同分隔符的一些说明,请参阅..好的,没有办法告诉sed字符串将被视为文字,您必须转义元字符以及分隔符usedIt。我们已经看到,当sed分隔符设置为/并且您的模式还包含/时,您需要转义m、 通过选择模式中不存在的其他分隔符(如|、#等),可以减少转义。谢谢。我终于找到了。您好,欢迎使用Stack Overflow。请不要将注释作为答案发布——只有真正尝试回答问题的内容才应该使用“发布您的答案”发布按钮。版主可以将此转换为评论,但通常在此处表示感谢的方式是单击您喜欢的内容旁边的向上箭头,或者单击您最喜欢的答案旁边的绿色复选标记。@tripleee我知道了!谢谢!
set a = ".\n*.\+"
echo "$input" | sed "s/$a/hi/g"