如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)
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
【讨论】:
这会将所有双引号替换为单引号,不起作用 不用转义'
,已经是字面意思了。以上是关于如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)的主要内容,如果未能解决你的问题,请参考以下文章