각 줄에서 n번째 일치 항목이 발견되면 패턴을 바꾸시겠습니까? [복사]

각 줄에서 n번째 일치 항목이 발견되면 패턴을 바꾸시겠습니까? [복사]

다음 줄이 포함된 파일이 있습니다.

india;austria;japan;chile
china;US;nigeria;mexico;russia

각 줄의 모든 세미콜론을 eg 로 바꾸고 싶지만 ;NEW;두 번째 항목부터 시작합니다. 결과는 다음과 같아야 합니다.

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

나는 이것을 gsub로 시도했지만 일어난 모든 것을 대체했습니다. awk '/;/{gsub(/;/,";NEW;") }{print}'

답변1

awk솔루션은 더 길지만 일반화하기가 더 쉽습니다.

awk -F\; '{for(i=1;i<NF;i++)printf"%s;%s",$i,(i>=2)?"NEW;":"";print$NF}' replacefile

sed명령을 사용하여 루프를 실행 t하고 항상 두 번째(또는 원하는 것) 구분 기호를 임시 토큰(보통 \n) 으로 바꾸는 것도 가능합니다 .

sed ':b;s/;/\n/2;tb;s/\n/;NEW;/g' replacefile

답변2

GNU sed 명령에는 s///이를 수행하는 플래그가 있습니다:

sed 's/;/;NEW;/2g' <<END
india;austria;japan;chile
china;US;nigeria;mexico;russia
END

산출

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

바라보다https://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-command

명령 s뒤에는 다음 플래그 중 0개 이상이 올 수 있습니다.

g

첫 번째 항목뿐만 아니라 정규식과 일치하는 모든 항목에 대체를 적용합니다.

숫자

교체만 가능숫자정규식의 첫 번째 일치입니다. 참고: posix 표준은 g혼합할 때 어떤 일이 발생하는지 지정하지 않습니다.숫자수정자는 현재 sed 구현 간에 널리 합의된 의미를 갖지 않습니다.GNU sed의 경우 상호 작용은 다음과 같이 정의됩니다. 이전 일치 항목 무시숫자그런 다음 모든 항목을 일치시키고 바꿉니다.숫자낮.

...

(강조는 내 것)

답변3

이 작업은 두 단계로 수행하겠습니다.

먼저 모든 세미콜론을 다음으로 바꿉니다 ;NEW;.

sed -e s/\;/\;NEW\;/g

;NEW;그런 다음 첫 번째 것을 세미콜론으로 바꿉니다.

sed -e s/\;NEW\;/\;/

파이프를 사용하여 한 줄에서 두 가지 대체를 수행할 수 있습니다. 예는 다음과 같습니다.

$ more replacefile 
india;austria;japan;chile;
china;US;nigeria;mexico;russia
$ cat replacefile |sed -e s/\;/\;NEW\;/g  |sed -e s/\;NEW\;/\;/
india;austria;NEW;japan;NEW;chile;NEW;
china;US;NEW;nigeria;NEW;mexico;NEW;russia

답변4

더 많은 코드로 할 수 있지만 루프는 없습니다!

데이터

china;US;nigeria;mexico;russia
iindia;austria;japan;chile

스크립트

BEGIN{ FS=";" }{
    insert=$param
    ix=index($0, insert) + length(insert)

    if (NF <= $param) {
            rest = substr($0,ix,length($0))
            gsub(";",";NEW;",rest)
            line = substr($0,0,ix) rest

            gsub(";;",";",line)
            gsub(";$","",line)
            print line

} else {print}}

 Microknoppix v # awk -f replaceNth.awk -v param=2 countries
 china;US;NEW;nigeria;NEW;mexico;NEW;russia
 iindia;austria;NEW;japan;NEW;chile

관련 정보