【问题标题】:Same regex in perl and sed work differentlyperl 和 sed 中的相同正则表达式的工作方式不同
【发布时间】:2019-11-29 21:29:55
【问题描述】:

好吧,也许是 unicode 等有问题,但代码说明了一切:

$ cat leo
сказывать
ссказываю
сказав
BladeMight@Chandere ~ 23:24:58
$ cat leo | perl -pe 's/^с+каз/Рассказ/g'
Рассказывать
ссказываю
Рассказав
BladeMight@Chandere ~ 23:25:00
$ cat leo | sed -r 's/^с+каз/Рассказ/g'
Рассказывать
Рассказываю
Рассказав

我有文件leo,内容为西里尔文,所以我想用perl -pe 中的正则表达式^с+каз 替换错误的地方,但它只替换只有1 个с(西里尔文之一)的地方,例如+ 在这种情况下什么都不做(对于非西里尔字母,它工作正常),尽管在 sed -r 中它工作得很好。为什么会这样?

【问题讨论】:

  • 您还需要避免使用useless cat
  • 提示:无需涉及cat。你可以使用perl -pe'...' leo
  • @ikegami 我会注意的。

标签: perl cyrillic


【解决方案1】:

需要告知 Perl 您的源代码是 UTF-8 (-Mutf8),并且应该将 stdin 和 stdout 视为 UTF-8 (-CS)。

$ cat leo | perl -Mutf8 -CS -pe 's/^с+каз/Рассказ/g'
Рассказывать
Рассказываю
Рассказав

【讨论】:

  • 注意:use utf8 仅在代码内部使用 utf8 编码时是必需的(例如在这种特殊情况下的搜索模式)。当utf8 输入/输出发生时,几乎任何时候都需要一个选项-CS
猜你喜欢
  • 2015-04-30
  • 2016-08-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多