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


10

我有一个包含多行xml的文件。我想替换文件的某些部分。文件的某些部分包含引号("),我想替换它们。我一直在尝试使用来转义引号\,但是基于文件的结果,我认为这不起作用。

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

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

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


2
你的命令看起来正确更换"text"'text'。当然它不会做任何事情"othertext"。显示一些输入行,以及相应的不需要的输出,并解释您想要的输出。
吉尔(Gilles)'所以

那么\"在sed命令中转义引号的正确方法是吗?
jbranchaud 2011年

4
不适用于sed:sed不需要或支持转义"。但是您的shell命令使用双引号字符串,并且\"在那里正确。该sed程序将s/"text"/'text'/ig视为的参数-e
吉尔(Gilles)“所以,别再邪恶了”,

@Gilles空格呢?sed是否理解并尊重空格?例如,如果我的命令包含s/\"text\" /'text'/ig该命令,那么将只能找到"text" 其后的空格吗?
jbranchaud 2011年

3
空格必须完全匹配。建议不要发布一些示例输入和相应的所需输出(并可能解释为什么需要更改报价),而不是继续进行此对话。甚至还不清楚这sed是否是正确的工具,也许您需要XML解析器。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


11

两个技巧:

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

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

    屈服foo'bar

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

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

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

鉴于上述两个技巧,可用于删除双引号和单引号的命令是:

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

根据我的第一个技巧,shell将sed的第二个参数(即之后的字符串-es|["']||g简化为并将该字符串传递给sed。根据我的第二个技巧,sed将此视为相同s/['"]//g。它的意思是

删除所有与'或匹配的字符"   (即,不替换任何字符)

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


1
在第二个技巧上有一个更好的要点:在使用s和y命令时,可以使用任何字符来代替/。将regexp与其他sed命令一起使用时,必须转义第一个定界符(如果使用/的替代方法)。如果要在正则表达式中匹配首选定界符,也必须对其进行转义。
Eli Heady

很难混用单引号和双引号。某些人发现,如果您引用单引号,可以将它们放在双引号中,而不是转义它们,从而更易于阅读。因此,'foo'\''bar'我们可能会使用而不是'foo'"'"'bar'
斯科特

1

我有一个Windows Unix实用程序端口,所以命令看起来有些不同,但是我有一个带逗号和引号的csv文件。使用此线程作为指导,我能够通过以下命令删除引号:

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

谢谢!被困在这个!
sendbits
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.