如何用sed替换文件中的引号?

如何用sed替换文件中的引号?

我有一个包含多行 xml 的文件。我想替换文件的某些部分。文件的某些部分包含"我想要替换的引号 ( )。我一直在努力逃脱引号\,但我认为根据我的文件的结果,这不起作用。

这是我的 sed 命令之一的示例:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

这是您在 sed 命令中转义引号的方式还是我做错了什么?

答案1

两个提示:

  1. 您无法转义用单引号引起来的字符串中的单引号。因此,您必须关闭报价,添加转义报价,然后再次打开报价。即:'foo'\''bar',分解为:

    • 'foo'        引foo
    • \'             逃脱了'
    • 'bar'        引bar

    屈服foo'bar

  2. (可选)您不一定必须/在 sed 中使用。我发现在同一个 sed 表达式中使用/and\会使阅读变得困难。

例如,要从此文件中删除引号:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

鉴于我上面的两个提示,您可以用来删除双引号和单引号的命令是:

$ sed -e 's|["'\'']||g'  /tmp/f

根据我的第一个技巧,shell 将 sed 的第二个参数(即 后面的字符串-e)缩减为s|["']||g并将该字符串传递给 sed。根据我的第二个技巧,sed 将其视为与s/['"]//g.它的意思是

删除所有与'或匹配的字符"   (即,将其替换为空)

您可能需要比这更复杂的东西来完成您想要的事情,但这只是一个开始。

答案2

我有一个 unix 实用程序的 Windows 端口,因此命令看起来有点不同,但我有一个带有逗号和引号的 csv 文件。使用此线程作为指南,我可以通过以下命令删除引号:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

相关内容