![awk를 사용하여 필드 1에서 마지막으로 나타나는 특정 문자를 바꾸는 방법](https://linux55.com/image/217785/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%95%84%EB%93%9C%201%EC%97%90%EC%84%9C%20%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C%20%EB%82%98%ED%83%80%EB%82%98%EB%8A%94%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
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
match
GNU 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
하며 gsub
GNU 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/'