【问题标题】:Remove all double quotes inside a string except the external删除字符串内的所有双引号,外部引号除外
【发布时间】:2013-10-31 10:16:01
【问题描述】:

如果我有如下字符串

"firstname surname"""

如何删除所有内部双引号但保留周围的引号。

我想保留周围的原因是因为这个字符串包含一个逗号,并且不希望它被视为 CSV 中的新列

我试过了

echo '"firstname surname"""' | sed -e "s/\"\"\+/ /g"

但总是删除右双引号。

【问题讨论】:

  • 您要删除所有双引号(正如答案所做的那样)还是所有不在字符串边缘的双引号?
  • 所有双引号不在字符串的边缘

标签: regex csv sed


【解决方案1】:

这是一种 perl 命令行比 sed 更适合的情况,因为 sed 不支持环视:

s='"firstname surname"foo"bar"'
echo "$s"| perl -pe 's/(?!^)"(?!$)//g'

"firstname surnamefoobar"

【讨论】:

  • @fedorqui: 哈哈 :) 因为我不知道 perl。我只知道如何使用 perl 命令行来使用 sed 不支持的复杂 PCRE 正则表达式
【解决方案2】:

也许这是太多的 sed,但我是这样的:

$ echo '"firstname surname"""' | sed -e 's/^"/@/' -e 's/"$/@/' -e 's/"//g' -e 's/@/"/g'
"firstname surname"

删除前导和结束"之间的所有"

$ echo '"firstn"ame "surname"""' | sed -e 's/^"/@/' -e 's/"$/@/' -e 's/"//g' -e 's/@/"/g'
"firstname surname"

说明

sed     -e 's/^"/@/'    -e 's/"$/@/'           -e 's/"//g'    -e 's/@/"/g'
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^           ^^^^^^^^^^^       ^^^^^^^^^
       replace leading and closing " with @    delete all "    set @ back to "

【讨论】:

  • 如果字符串包含@ 作为内容怎么办。例如邮件地址?
  • 是的...我猜 OP 应该使用另一个奇怪的字符。当答案被接受时,我想这个解决方法已经足够了,虽然它只是一种解决方法,但想看看sed 表达式可以实现什么。
【解决方案3】:

你可以这样做:

$ echo '"firstname surname"""' | sed -e 's/["]["]//g' 
"firstname surname"

【讨论】:

  • 输入的是:"firstname surname"foo""
【解决方案4】:

使用awk

echo '"firstname surname"""' | awk '{gsub(/""/,x)}1'
"firstname surname"

【讨论】:

    【解决方案5】:

    这可能对你有用(GNU sed):

    sed -r ':a;s/^("[^"]*)"(.*")$/\1\2/;ta' file
    

    或:

    sed 's/"//g;s/.*/"&"/' file
    

    【讨论】:

    • 嗯,我猜这是假设双引号始终存在于字符串的开头和结尾。不过看起来不错。
    【解决方案6】:
    sed 's/["]\{2,\}/"/g'
    

    仅将超过 1 个“(["]\{2,\})的所有出现删除一个”。它也可以用于周围引号不是要处理的完整字符串的第一个和最后一个字符的情况。

    如果只保留外部报价就可以了

    sed 's/^[^"].*[^"]$/&/;t;s/^"\(.*\)"$/\1/;s/"//g;s/.*/"&"/'
    

    这也确保了我们不会为没有被引号包围的字符串修改 "

    如果您将引用的字符串放入另一个上下文中,只需给我们一个示例(尤其是分隔符信息)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多