사용자 정의 유틸리티를 사용하여 검색 및 바꾸기

사용자 정의 유틸리티를 사용하여 검색 및 바꾸기

정규식과 일치하는 값을 바꾸는 유틸리티를 실행하고 싶습니다. 즉, 정규식의 각 일치 항목에 대해 일치 항목을 구성하는 문자를 사용하여 유틸리티가 호출됩니다. 유틸리티의 출력은 원래 문자를 대체합니다.

설명을 위해 다음을 사용합니다 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 명령이 작동하지 않는 이유는 Perl과 달리 sed가 전체 패턴 공간을 실행하기 때문입니다. Perl은 생각한 대로 수행하고 s/// 명령의 rhs에서와 같이 여러 번 수행하며 너무 많은 부분만 대체합니다. 명령 출력을 위해.

이것이 바로 sed가 "Given:"을 표절한 것을 발견한 경우 유틸리티를 찾을 수 없는 이유입니다. 주어진 것은 패턴 공간의 시작입니다. 화타이

답변2

펄에서는 가능합니다. 사용나뉘다,지도,스칼라,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

관련 정보