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