반복되는 단어 중 하나 바꾸기

반복되는 단어 중 하나 바꾸기

안녕하세요. 저는 이 분야가 처음이므로 양해해 주시기 바랍니다. 단어를 바꾸고 싶은 .txt 파일이 있는데 문제는 해당 단어가 계속해서 반복된다는 것입니다(이와 같은 줄이 수백만 개 있다고 가정할 때).

TOPIC:
APPLE
APPLE
APPLE
BANANA

이렇게 처음 나오는 Apple을 Mango로 교체하고 싶습니다.

TOPIC:
MANGO
APPLE
APPLE
BANANA

sed 또는 awk를 통해 특별히 이 작업을 수행할 수 있는 방법이 있습니까(내가 아는 한 sed는 단어를 바꾸는 데 사용할 수 있지만 여러 줄의 입력은 사용할 수 없습니다. 제 경우에는 첫 번째 단어만 바꾸려고 합니다) btw 결론, 도구를 사용하여 다른 방법으로 구현할 수 있다면 좋을 것입니다.

답변1

sed다음 이외의 내용을 나타내는 첫 번째 줄이 항상 있다고 가정하고 사용하세요 APPLE.

sed '1,/APPLE/ s/APPLE/MANGO/' file

이는 라인 1부터 하위 문자열을 포함하는 다음 라인까지 일치합니다 APPLE. 이 줄에서는 하위 문자열 APPLEMANGO. 효과가 처음으로 나타납니다.APPLE 첫 번째 줄 이후로 대체됩니다 MANGO.

GNU를 사용하면 sed다음을 사용할 수 있습니다.

sed '0,/APPLE/ s/APPLE/MANGO/' file

하위 문자열이 포함된 경우 첫 번째 줄도 덮어씁니다 APPLE.


그리고 awk:

awk '!found && /APPLE/ { sub("APPLE", "MANGO"); found = 1 }; 1' file

APPLE이는 각 줄에서 하위 문자열을 찾으려고 시도하며 일단 발견되면 sub()호출은 하위 문자열을 MANGO. 그런 다음 플래그 변수는 found1로 설정됩니다(부울진짜값) 교체가 다시 발생하는 것을 방지합니다. 수정 여부에 관계없이 각 줄은 무조건 인쇄됩니다.


사용 ed:

printf '%s\n' '/APPLE/ s//MANGO/' ,p Q | ed -s file

하위 문자열이 포함된 행을 검색합니다 APPLE. 발견되면 하위 문자열을 로 바꿉니다 MANGO. 파일의 첫 번째 일치 항목만 처리됩니다.

스크립트 편집

/APPLE/ s//MANGO/
,p
Q

검색 및 바꾸기를 수행하고, 전체 편집 버퍼를 표준 출력으로 인쇄하고, 무조건 종료합니다.

답변2

$ awk '$0=="APPLE" && !done++{ $0="MANGO" } 1' file
TOPIC:
MANGO
APPLE
APPLE
BANANA

답변3

사용 perl:

$ perl -lpe '$_ = "MANGO" if m?APPLE?' file

결과:-

TOPIC:
MANGO
APPLE
APPLE
BANANA

POSIX sed 구성을 사용하면 다음 작업도 수행할 수 있습니다.

sed -e '
  1{x;s/^/MANGO/;x;}
  /APPLE/!b
  G
  /\n$/{P;d;}
  z;x
' file

POSIX sed z로 대체되었습니다 .s/.*//

관련 정보