每行末尾反转东方阿拉伯数字

每行末尾反转东方阿拉伯数字

我有一个包含 10,000 行的文件,每行末尾都有一个数字,例如:

asdf ggg ١
gghh rtt ٣٢٥
tyyu bnnn jigff ٢٧

将所有数字的数字按相反顺序排列。正确的顺序是:

asdf ggg ١
gghh rtt ٥٢٣
tyyu bnnn jigff ٧٢

你能帮我把每行数字的顺序颠倒过来吗?

东阿拉伯语数字:

(٠, ١, ٢, ٣, ٤, ٥, ٦, ٧, ٨, ٩)

答案1

使用 Perl:

$ perl -CSD -pe 's/(\d+)$/reverse($1)/e' file
asdf ggg ١
gghh rtt ٥٢٣
tyyu bnnn jigff ٧٢

这会将替换命令应用于每行输入。替换匹配行末尾的任何数字字符串。无论匹配什么数字串,该reverse()函数都会将其反转。还原的结果用作替换中的替换文本。

尾随/e导致 Perl 将 视为reverse($1)要计算的命令。

启用 UTF-8 I/O-CSD的选项。perl

答案2

使用(以前称为 Perl_6)

~$ raku -pe 's/ (\d+) $ /{flip($0)}/;'  file

或者

~$ raku -pe 's/ (\d+) $ /{$0.flip}/;'  file

输入示例:

asdf ggg ١
gghh rtt ٣٢٥
tyyu bnnn jigff ٢٧

示例输出:

asdf ggg ١
gghh rtt ٥٢٣
tyyu bnnn jigff ٧٢

上面的 Raku 解决方案与已经发布的 Perl 解决方案类似,但一个显着的区别是默认情况下 Raku 中可以很好地处理 Unicode(无需记住额外的命令行标志)。捕获从$0Raku开始。 Raku 中的关键字有些不同(更精确?):使用关键字翻转字符串的字母flip;要反转列表的顺序,请使用关键字reverse

{ … }正则表达式中的代码块用大括号表示。在学习 Raku 时,如果您使用 Perl(5)/e标志,您会收到一条很好的消息:

Unsupported use of /e.  In Raku please use: interpolated {...} or s{} =
...  form

https://docs.raku.org/language/unicode
https://docs.raku.org/language/regexes
https://raku.org

相关内容