Awk
使用自定義實用程序搜尋和替換
我想執行一個實用程序來替換與正則表達式匹配的值。這意味著對於正則表達式的每個匹配項,使用構成匹配項的字元呼叫實用程序。該實用程序的輸出替換了原始字元。
出於說明目的,使用
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 中可能。使用split、map、scalar、lc、reverse、ucfirst、join。由於匹配的逗號和上下文敏感性,比我最初想像的要復雜一些。
#!/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.';