【问题标题】:Why sed regexp changes the text partially and inconsistently为什么 sed 正则表达式会部分且不一致地更改文本
【发布时间】:2018-04-21 18:26:02
【问题描述】:

我想将 "abc ö-Ö ä-Ä å-Å def" 字符串的 ä 更改为 ae,将 å 更改为 aa,将 ö 更改为 oe。

sed -i 's/ä/ae/g' aFile | sed -i 's/å/aa/g' aFile | sed -i 's/ö/oe/g' aFile

这个命令有时只改变ö和ä,有时只改变ä。奇怪的是,该命令有时以另一种方式工作,有时以另一种方式工作。它有什么问题?

提前谢谢你

【问题讨论】:

  • 你能提供(很大一部分)输入文件吗?还请提供有关您在哪个平台上运行它的更多信息,您的语言环境设置是什么..

标签: regex linux ubuntu sed


【解决方案1】:

-i(就地编辑)和管道不混合。以下两个命令中的任何一个都可以使用:

  • sed -i -e 's/ä/ae/g' -e 's/å/aa/g' -e 's/ö/oe/g' aFile

  • sed -i 's/ä/ae/g' aFile; sed -i 's/å/aa/g' aFile; sed -i 's/ö/oe/g' aFile

基本上,问题中给出的代码中发生的情况是三个seds 都是并行启动的,它们都想修改同一个文件。这会导致不确定的行为,因为您不可能知道三个 seds 中的哪一个从文件中读取了什么。

其次,如果用-i(就地编辑)调用sed,它不会读取标准输入,也不会写入标准输出。

啊,顺便说一下,这只处理小写的[äåö]

【讨论】:

  • 感谢 @AlexP 提供的非常有帮助的回答!
【解决方案2】:

您可以使用单个 sed 命令实现目标:

sed -i 's/ä/ae/g; s/å/aa/g; s/ö/oe/g' aFile

【讨论】:

  • 感谢@RomanPerekhrest!其实我已经按照你写的方式解决了问题,但是 sed 的行为很奇怪,所以我发布了这个问题;)
猜你喜欢
  • 2022-11-23
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多