Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 差异sed命令sed';s//';及sed";s###;_Linux_Unix_Sed - Fatal编程技术网

Linux 差异sed命令sed';s//';及sed";s###;

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###” 如何像对待纯字符串一样对待输入 一,。这些命令之间有什么区

我想问两个关于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###”
  • 如何像对待纯字符串一样对待输入
  • 一,。这些命令之间有什么区别:sed's//'和sed“s####”
    ---在您的情况下,
    /
    #
    是关键“部分”的分隔符:

    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 sed
    a=“.\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"