다음 줄이 포함된 파일이 있습니다.
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