用sed替换特殊字符

时间:2015-04-20 12:53:34

标签: sed

我正在尝试使用sed命令替换文件中的特殊字符。 由%>替换的字符为]。 我正在使用sed -r s/\%>\/\]\/g,但我有这个错误bash: /]/g: No such file or directory,看起来像是不喜欢它。

3 个答案:

答案 0 :(得分:4)

将您的sed代码放在引号内,并添加您想要使用的文件路径,最后不要转义sed分隔符。

$ echo '%>' | sed 's/%>/]/g'
]

sed 's/%>/]/g' file

答案 1 :(得分:2)

补充Avinash Raj's correct and helpful answer

由于您使用的是整体未加引号的字符串(既不是单引号也不是双引号),因此您\处于正确的轨道上 - 在sed中转义个别字符}命令。

然而,您忽略了\ - 引用>,这是导致您出现问题的原因

  • >是shell之一的所谓元字符
  • 元字符具有特殊含义,单独的字
  • 因此,s/\%>\/\]\/g>错误地拆分为 2 参数:
    • s/\%传递给sed - s/%,因为shell会删除\个实例(名为 quote removal 的进程)。
      • 正如您所看到的,这不是一个有效的sed命令,但它甚至没有发挥作用 - 见下文。
    • >\/\]\/g shell bash)解释,因为它以输出重定向运算符>开头;删除引号后,shell会看到>/]/g,尝试打开文件 /]/g进行写入,但失败,因为您的系统没有名为{{1的子目录在其根目录中。
  • ]尝试在运行命令之前打开由重定向指定的输出文件,如果无法打开文件,则不会运行命令 - 这就是这里发生的事情:
    • bash抱怨不存在的目标目录和命令的中止处理 - bash甚至从未被调用

<强>结果是:

  • 在既未包含在单引号中也不包含在双引号中的字符串中,您必须sed - 引用:
    • 所有元字符:\
    • 另外,为了防止意外的路径名扩展(通配):| & ; ( ) < > space tab
    • 另请注意,如果您需要为* ? [ 引用(转义)字符,则需要添加额外的引用层;例如,为了指示sed在正则表达式中使用文字 sed,您必须传递. - 两个反斜杠 - 以便\\.看到正确转义的sed
  • 鉴于上述情况, (习惯性地)在\.命令周围使用单引号要简单得多,因为它确保传递字符串< em>就像sed

让我们将您的命令的工作版本与Avinash Raj's answer中的版本进行比较(为简洁起见,省略sed):

-r

答案 2 :(得分:1)

我不确定我是否正确地提出了问题。如果您想要%替换>],则此处不需要sed。在这种情况下使用tr

tr '%>' ']' < input.txt

如果您想用%>替换序列],那么@AvinashRaj所示的sed命令就是您的选择。