gpt4 book ai didi

regex - Perl 命令行替换 unicode

转载 作者:行者123 更新时间:2023-12-01 09:15:49 25 4
gpt4 key购买 nike

我正在尝试使用 shell 脚本将每个单词(存储在名为 _id 的 tmp 文件中)替换为一个数字。它工作正常,除了 unicode 单词,生成一个数字但使用 Perl 替换不起作用。有问题的bash代码如下:

x=0
for id in `cat _id`; do
echo $x $id
perl -p -i -e "s/\b$id\b/$x/g" x_graph.dot
x=$(($x + 1))
done

有人可以指出错误在哪里吗?

最佳答案

假设您有 é (U+00E9) 使用 UTF-8 编码:C3 A9 .由于您不进行任何解码,因此您获得了由 "\xC3\xA9" 生成的字符串.

正则表达式——或者更确切地说\b , \w , \d等— 期望输入是 Unicode 代码点,这意味着您有效地提供了 U+00C3U+00A9而不是 U+00E9。 U+00C3 是单词字符,但 U+00A9 不是,所以第二个 \b与预期匹配的位置不匹配。

所以你需要解码你的输入和编码你的输出。 -C为 UTF-8 提供了一种方便的方法。

perl -i -CSDA -pe'
BEGIN {
($id, $x) = splice(@ARGV, 0, 2);
die "Bad id" if $id !~ /^\w(?:.*\w)?\z/s;
}

s/\b\Q$id\E\b/$x/g
' "$id" "$x" x_graph.dot

笔记:
  • 通过使用命令行参数来传递参数,我修复了一个注入(inject)错误。
  • 使用\b假设 $id总是以 \w 开头char 并且总是以 \w 结尾char,所以我添加了一个检查来验证这个假设。
  • 通过使用 \Q..\E要将 id 转换为正则表达式模式,我修复了注入(inject)错误。


  • 测试:
    $ printf "é\n" >_id

    $ printf "[é]\n" >x_graph.dot

    $ x=0

    $ id=`cat _id`

    $ perl -i -CSDA -pe'
    BEGIN {
    ($id, $x) = splice(@ARGV, 0, 2);
    die "Bad id" if $id !~ /^\w(?:.*\w)?\z/s;
    }

    s/\b\Q$id\E\b/$x/g
    ' "$id" "$x" x_graph.dot

    $ cat x_graph.dot
    [0]

    关于regex - Perl 命令行替换 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241816/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com