如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)

Posted

技术标签:

【中文标题】如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)【英文标题】: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"

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

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

【问题讨论】:

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

【讨论】:

这会将所有双引号替换为单引号,不起作用 不用转义',已经是字面意思了。

以上是关于如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)的主要内容,如果未能解决你的问题,请参考以下文章

如何用 sed 的变量替换单引号字符串? [复制]

iphone sdk,撇号显示为问号

Java用'(撇号/单引号)和\(反斜杠)一起替换问题

如何在 PHP 中去除特殊的引号字符?

shell中的   中文和英文   双引号

utf-8 (PHP, str_replace) 中是不是有不同类型的双引号?