试图用单撇号代替双撇号。但无法做到正确。
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/\'/\"/