Awk

使用自定義實用程序搜尋和替換

  • July 20, 2018

我想執行一個實用程序來替換與正則表達式匹配的值。這意味著對於正則表達式的每個匹配項,使用構成匹配項的字元呼叫實用程序。該實用程序的輸出替換了原始字元。

出於說明目的,使用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 -pe 's/(\d+)/qx(factor $1) =~ s|\n||r/ge'  input-file.txt

您的 sed 命令不起作用的原因是因為 sed 將執行整個模式空間,這與 Perl 不同,Perl 與您的思維方式一致,並且執行的次數與 s/// 命令的 rhs 上的一樣多,並且替換了那麼多與命令輸出。

這就是為什麼如果您注意到 sed 正在使用 abt “Given:” 實用程序未找到的原因。Given 是您的模式空間的開始。高溫高壓

在 Perl 中可能。使用splitmapscalarlcreverseucfirstjoin。由於匹配的逗號和上下文敏感性,比我最初想像的要復雜一些。

#!/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.';

引用自:https://unix.stackexchange.com/questions/456991