用sed替换特殊字符

冰人225

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

mklement0

为了补充Avinash Raj的正确和有用的答案

由于您使用的是整体未用引号引起来的字符串(无论是单引号还是双引号),因此通过命令中\转义各个字符可以使您处在正确的轨道上sed

但是,您忽略了\-quote >,这是导致您出现问题的原因

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

结果:

  • 在既不包含在单引号也不包含在双引号中的字符串中,必须\-quote:
    • 所有元字符: | & ; ( ) < > space tab
    • 另外,为防止意外的路径名扩展(globbing): * ? [
    • 还要注意的是,如果你需要引用(转义)字符sed,你需要添加一个引用的额外层; 例如,要指示在正则表达式中sed使用文字 .,您必须传递\\.-两个反斜杠-这样才能sed正确转义\.
  • 鉴于上述情况,(习惯上)命令周围使用单引号要容易得多sed,因为它可以确保按原样将字符串传递sed

让我们将您的命令有效版本与Avinash Raj的答案的版本进行比较-r为简洁起见,省略了以下内容):

sed  s/\%\>\/\]\/g  # ok - all metachars. \-quoted, others are, but needn't be quoted
sed  s/%\>/]/g      # ok - minimum \-quoting
sed 's/%>/]/g'      # simplest: single-quoted command

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章