awk를 사용하여 필드 1에서 마지막으로 나타나는 특정 문자를 바꾸는 방법

awk를 사용하여 필드 1에서 마지막으로 나타나는 특정 문자를 바꾸는 방법

awk를 사용하여 첫 번째 필드에서 마지막 마침표를 세미콜론으로 바꾸려고 합니다. 필드 구분 기호도 세미콜론입니다.

이것을 regex101.com에서 정규식으로 테스트한 결과 (\.)(?!.*\1)"abcmp3"을 입력으로 제공했을 때 마지막 마침표가 올바르게 강조 표시되었습니다.

나는 awk에서 다음을 시도했습니다.

awk 'BEGIN{FS=OFS=";"} {gsub(/(\.)(?!.*\1)/, ";", $1)} 1'

그것은 아무것도 대체하지 않습니다.

이 문제를 도와주실 수 있는 분이라면 누구에게나 매우 감사하겠습니다.

답변1

AFAIK, awk 구현은 PCRE 둘러보기를 지원하지 않습니다 (?!re).

GNU awk(일명 gawk)에서는 다음을 사용합니다.뿌리함수를 사용하면 해당 기간 이전의 모든 것을 탐욕스럽게 캡처하고 교체 시 이를 되돌릴 수 있습니다.

$ echo 'foo.bar.baz;something;else' | 
    gawk 'BEGIN{OFS=FS=";"} {$1 = gensub(/(.*)\./,"\\1;","1",$1)} 1'
foo.bar;baz;something;else

휴대용으로 사용할 수 있습니다성냥함수를 사용하여 다시 욕심 일치를 수행한 다음 마침표 앞과 뒤의 하위 문자열을 선택합니다.

$ echo 'foo.bar.baz;something;else' | 
    mawk 'BEGIN{OFS=FS=";"} match($1,/.*\./){$1 = substr($1,1,RLENGTH-1) ";" substr($1,RLENGTH+1)} 1'
foo.bar;baz;something;else

matchGNU awk를 사용하면 선택적 배열 인수를 통해 캡처 및 역치환을 (이 역시 이식 불가능하게) 사용할 수 있습니다 .

$ echo 'foo.bar.baz;something;else' | 
    gawk 'BEGIN{OFS=FS=";"} match($1,/(.*)\.(.*)/,a){$1 = a[1] ";" a[2]} 1'
foo.bar;baz;something;else

미리보기는 Perl과 호환되므로 물론 Perl을 사용할 수 있습니다(비록 캡처 및 역참조가 없으면 \.어떤 경우에도 과잉이 될 수 있지만).

$ echo 'foo.bar.baz;something;else' | 
    perl -F';' -pe '$_ = join ";", $F[0] =~ s/\.(?!.*\.)/;/r, @F[1..$#F]'
foo.bar;baz;something;else

밀러awk와 유사 sub하며 gsubGNU awk와 마찬가지로 gensub캡처 및 역참조를 지원합니다.

$ echo 'foo.bar.baz;something;else' | 
    mlr --nidx --fs ';' put '$1 = sub($1,"(.*)\.","\1;")'
foo.bar;baz;something;else

내가 아는 한, 현재는 둘러보기를 지원하지 않습니다.

답변2

어때요 sed? 귀하의 경우 도메인 1에서 일할 수 있는 행운을 얻었습니다.

sed 's/\.\([^.]*;\)/;\1/'

관련 정보