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

时间:2017-02-19 07:47:57

标签: 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

echo "$input" | sed "s#${a}#hi#g" # It will run but not true

我的问题是:

  1. 这些命令有什么区别:sed' s /'和sed " S ###"
  2. 如何将输入视为纯粹的字符串?

3 个答案:

答案 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)

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

因此,现在我将分隔符更改为#。它就像评论角色一样。