如何用 sed 将“单”撇号替换为“双”撇号

如何用 sed 将“单”撇号替换为“双”撇号

试图用单撇号代替双撇号。但无法做到正确。

sed 's/'/"/'

答案1

在类似 Bourne 的 shell 中,单引号不能在单引号内转义,因此'\''在 shell 命令行或脚本中将单引号“嵌入”单引号字符串内的标准方法也是如此。它实际上并未嵌入单引号,但它实现了所需的最终结果。

'\''= '(结束引号)\'(转义引号)和'(开始引号)。

换句话说,不是:

sed 's/'/"/g'

使用:

sed 's/'\''/"/g'

或者,双引号可以在双引号内进行反斜杠转义,因此您可以使用:

sed "s/'/\"/g"

请小心这种形式 - 您必须转义 shell 元字符,您希望将其视为双引号内的字符串文字。例如,sed 's/foo/$bar/'将 foo 替换为字符串文字$bar,而sed "s/foo/$bar/"将 foo 替换为当前 shell 变量的值$bar(如果未定义,则不替换任何内容。注意:变量的某些值$bar可能会破坏 sed 命令 - 例如,如果$bar包含未转义的分隔符就像bar='a/b',这会导致 sed 命令出现s/foo/a/b/语法错误)

另一种(可能是最好的)替代方法是使用引号$''来引用字符串。这种引用风格确实允许转义单引号。这改变了 shell 解释带引号的字符串的方式,因此如果字符串包含其他转义字符或字符序列,可能会产生其他副作用(例如\xHH- “HH”将被解释为内部 8 位字符的十六进制表示$'',但是如果它不带引号或在双引号内,它将被解释为纯文本“xHH”)。

sed $'s/\'/"/g'

注意:$''适用于 bash、ksh、zsh 等。它在 中不起作用dash

答案2

使用tr(如果您想在整个文件中全局执行此操作):

tr "'" '"' <infile >outfile

正在做

sed 's/'/"/'

您基本上sed 's/'后面跟着/"/',它是一个斜杠和一个未闭合的双引号字符串。

sed s/\'/\"/

你没有这样的问题。

如果感觉引用该sed表达式更好(在本例中不需要),请执行

sed 's/'"'"'/"/'

sed 's/'接下来是("'"双引号单引号),然后是'/"/'.

tr另请注意,如果您想在 中进行模拟sed,即如果您想进行单字符音译,则使用y///is很多比使用更有效s///g(注意/g那里):

sed y/\'/\"/

答案3

  echo "don't forget that" | sed 's/\x27/\"/'

答案4

无需引用整个sed表达式:

echo \' | sed s/\'/\"/

相关内容