【问题标题】:How to replace double quotes within a string with apostrophe (not the outer double quotes specifying it's a string)如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)
【发布时间】:2021-11-12 20:56:36
【问题描述】:

我在 Linux 中有管道分隔的 .txt 文件,其中包含双引号内的字符串。

有些字符串会有双引号而不是撇号。

例如我是一个字符串。

这将在管道内的文件中表示为“我”是一个字符串

我需要用“I'm a string”替换“I”m a string。

如何使用 sed 或 Python/Jupyter 做到这一点?

例子

"String"|"I"m not a valid string"|"I'm a valid string"

根据数据要求,我不需要担心以下事情:

  1. 双引号内的管道,例如"Str|Srt"|"Str"
  2. 双引号和单引号等的混合"Str'|'Str"

【问题讨论】:

  • 不是"I""m a string"?将引号加倍是以类似 CSV 的格式转义它们的常用方法。
  • @Shawn - 我使用的示例来自我使用过的外部文件。所以我接收数据的格式是“word”|“I”m another word”|“Something else”。在这种情况下,我试图将“I”m another word”修复为“I'm another word” .您是否建议将“”替换为“”并且它会正常阅读?

标签: python linux bash sed


【解决方案1】:

这个sed 应该可以工作

sed -E "s/([A-Za-z0-9])\"([^|].*)/\1\'\2/g" input_file

通过sed 中的分组,您可以从匹配中排除无效的引用",并在恢复组时替换它。

输出

"I'm a string"

【讨论】:

  • 这正是我想要的输出,但还没有成功。我会再看一遍并更新线程。谢谢。
  • @Angelo 不客气
  • 你应该提到-E需要GNU或BSD sed。如果您将其设为-r,那么它将仅适用于旧版本的 GNU sed,而不适用于 BSD。我怀疑如果任何带引号的字符串包含任何不是数字的东西,它就会失败,例如"I am 7"th in line",或字符串中有多个 "s 的情况。
  • 它不仅仅是整数,它也可以是标点符号或空格。你的文字说你想排除",所以只需为此编写/使用正则表达式[^"],而不是尝试编写一个包含所有不是"的字符的正则表达式,如果这是意图的话。跨度>
  • @EdMorton 注意 :) 我使用提供的数据。如果 OP 有进一步的要求或更多的条件参数,则应将其显示出来,以便有可用的数据可供使用。我已将您的考虑考虑在内进行了编辑。
【解决方案2】:

我可能很想使用 perl

$ cat file.txt
"first"|"second"|"I"m a string"|"fourth"

$ perl -lne '
  print join "|",              # join, clearly
    map {"\"" . $_ . "\""}     # re-add outer quotes
    map {s/"/\047/g; $_}       # replace inner quotes
    map {s/^"|"$//g; $_}       # remove leading/trailing quotes
    split /[|]/                # split the input on pipes
' file.txt
"first"|"second"|"I'm a string"|"fourth"

虽然,正如 Shawn cmets 一样,用双引号替换内引号会为您提供有效的 CSV。

    map {s/"/""/g; $_}       # replace inner quotes

【讨论】:

  • 我不懂 Perl,所以在描述中添加了一个说明,询问是否可以使用 Bash (sed) 或 Python/Jupyter 来完成。
【解决方案3】:

在每个 Unix 机器上的任何 shell 中使用任何 sed:

$ sed "s/\"/'/g; s/'|'/\"|\"/g; s/^'/\"/; s/'$/\"/" file
"String"|"I'm not a valid string"|"I'm a valid string"

【讨论】:

    【解决方案4】:

    在使用 sed 时,你应该转义 " 和 '。sed 命令的语法是: “s/old_pattern/new_pattern/g”,其中“g”代表全局匹配。 您需要的解决方案是:

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

    【讨论】:

    • 这会将所有双引号替换为单引号,不起作用
    • 不用转义',已经是字面意思了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多