使用自定义实用程序搜索和替换

使用自定义实用程序搜索和替换

我想运行一个实用程序来替换与正则表达式匹配的值。这意味着对于正则表达式的每个匹配,都使用组成匹配的字符调用实用程序。该实用程序的输出将替换原始字符。

出于说明目的,使用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

我要求的是可以使用核心实用程序吗?

答案1

运行以下命令:

 perl -pe 's/(\d+)/qx(factor $1) =~ s|\n||r/ge'  input-file.txt

你的 sed 命令不起作用的原因是因为 sed 将执行整个模式空间,与 Perl 不同,Perl 与你的想法一致,并且执行的次数与 s/// 命令的 rhs 上的一样多,并且只替换了那么多与命令输出。

这正是为什么如果您注意到 sed 抄袭 abt “Given:” 实用程序未找到的原因。给定是你的模式空间的开始。华泰

答案2

在 Perl 中可能。使用分裂,地图,标量,LC,撤销,UC第一,加入。由于匹配的逗号和上下文敏感性,比我最初想象的要复杂一些。

#!/usr/bin/perl
use warnings;
use strict;

sub rev {
    my ($string) = @_;
    my @words = split /(\W+)/, $string;
    my @caps = map scalar(/^[[:upper:]]/), @words;
    $_ = /\w/ ? lc reverse : $_ for @words;
    shift @caps and $_ = ucfirst for @words;
    return join "", @words
}

use Test::More tests => 1;
my $r = rev('Hello, my name is Yimin Rong.');
is $r, 'Olleh, ym eman si Nimiy Gnor.';

答案3

尝试下面的 awk 解决方案:

echo "Hello" | awk '{ for ( i=length($0);i>0;i-- ) { if (i == length($0) ) { printf "%s",toupper(substr($0,i,1)) } else {  printf "%s",tolower(substr($0,i,1)) } } printf "\n" }'

从最后一个字符开始逐个字符地取出单词的每个字母。如果是最后一个字符,则转换为大写并打印,否则打印小写。

答案4

运行以下命令:

perl -pe 's/(\d+)/qx(factor $1) =~ s|\n||r/ge'  input-file.txt

相关内容