用 sed 替换特殊字符

Replace specials characters with sed

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

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

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

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

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

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

如果您想用 ] 替换序列 %>,那么 @AvinashRaj 显示的 sed 命令是可行的方法。

补充

由于您使用的是整个未加引号的字符串(既不是单引号也不是双引号),您通过 \-转义 个别 个字符走在了正确的轨道上你的 sed 命令。

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

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

结果:

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

让我们将您的命令的 工作 版本与来自 的版本进行比较(为简洁起见,省略 -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