我想运行一个实用程序来替换与正则表达式匹配的值。这意味着对于正则表达式的每个匹配项,调用包含匹配项的字符的实用程序。该实用程序的输出将替换原始字符。
出于说明目的,使用factor
:
$ factor 230
230: 2 5 23
所以使用这个实用程序,我想挑选出整数,factor
用整数调用,并用 的输出替换原始整数factor
。
这是我对示例输入的期望:
$ [code] <<< "Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes."
Given the numbers with factors: 27: 3 3 3, 13: 13, 230: 2 5 23, and 19: 19, it is evident which are primes.
我认为这可能有效,但它看起来像是在尝试直接解释输入。使用sed (GNU sed) 4.2.2
.
$ sed -E 's/([0-9]+)/factor \1/ge' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
sh: 1: Given: not found
显然我不明白这e
面旗帜的作用。删除e
显示正则表达式正确提取整数并将它们作为\1
.
我尝试这样做awk
:
$ awk '{r = gensub(/([0-9]+)/, system("factor \\1"), "g"); print r}' <<< 'Given the numbers with factors: 27, 13, 230, and 19, it is evident which are primes.'
1:
Given the numbers with factors: 0, 0, 0, and 0, it is evident which are primes.
我不确定它1:
来自哪里,但很明显它只是打印来自system
. 似乎没有办法从awk
.
我要求的是使用核心实用程序的可能吗?
在 Perl 中可能。使用split、map、scalar、lc、reverse、ucfirst、join。由于匹配的逗号和上下文敏感性,比我原先想象的要复杂一些。
运行以下命令:
您的 sed 命令不起作用的原因是因为 sed 将执行整个模式空间,这与 Perl 不同,Perl 与您的想法和执行方式一致,与 s/// 命令的 rhs 一样多,并且仅替换那么多与命令输出。
这就是为什么如果您注意到 sed 抄袭了 abt “Given:” utility not found 的原因。Given 是你的模式空间的开始。高温高压
试试下面的 awk 解决方案:
从最后一个字符开始逐个字符地获取单词的每个字母。如果它是最后一个字符,则转换为大写并打印,否则打印小写。
运行以下命令: