【问题标题】:replace with sed on Mac OS X Leopard doesn't do what expected在 Mac OS X Leopard 上替换为 sed 并没有达到预期的效果
【发布时间】:2011-01-16 12:42:43
【问题描述】:

我正在尝试使用 sed 将 \"(反斜杠双引号)替换为 '(引号)。

sed "s/\\\"/\'/g" file.txt

该命令未按预期工作。它替换了文本文件中的所有“,而不仅仅是\”。

它和 sed "s/\"/\'/g" file.txt 做同样的事情

我正在开发 Mac OS X Leopard。

有人知道吗?

【问题讨论】:

  • 如有疑问,请添加另一个反斜杠。

标签: regex macos unix sed


【解决方案1】:

不必使用太多引号。 \042 八进制表示",\047 表示八进制表示单引号

awk '{gsub("\042","\047") }{print}' file

【讨论】:

    【解决方案2】:

    引用 bash 的问题很有趣。

    $ cat 输入
    “这是一个有引用问题的“输入文件”。”
    $ sed -e 's/\\"/'"'"'/g' 输入
    “这是一个存在引用问题的‘输入文件’。”

    请注意,三个字符串拼接在一起构成 sed 脚本:

    • s/\\"/
    • '
    • /g

    第一个和最后一个用单引号引起来,中间用双引号引起来。

    Matthew 的命令通过连接两个字符串而不是三个字符串来工作:

    • s/\\"/
    • '/g

    第一个是单引号,第二个是双引号。

    【讨论】:

    • 不错。您可以将其稍微简化为 sed -e 's/\\"/'"'/g" 输入
    【解决方案3】:

    您正在处理臭名昭著的 shell 引用问题。尝试在 s//g 周围使用单引号,或添加额外的转义:

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

    【讨论】:

    • 我不认为这正是 shell 引用问题,因为问题在于 sed 对字符串的解释,而不是 shell 的。 sed 看到 s/\"/\'/g 并将 \" 解释为与 "相同。
    • @William - 我将其描述为“shell 引用问题”,因为 bash “吞噬”了其中一个转义符,因此 sed 看不到它。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多