我有一个包含 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(无需记住额外的命令行标志)。捕获从$0
Raku开始。 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