줄을 복사하고 sed를 사용하여 중복 줄을 검색하고 바꾸는 방법은 무엇입니까?

줄을 복사하고 sed를 사용하여 중복 줄을 검색하고 바꾸는 방법은 무엇입니까?

특정 특수 문자가 포함된 텍스트 파일의 줄을 복사하려고 하는데 복사본에서 특수 문자가 "일반" ASCII 문자로 대체됩니다. 특정 사용 사례는 악센트 문자입니다.

입력하다:

éva
test
frédéric

원하는 출력:

éva
eva
test
frédéric
frederic

이제 해당 문자가 포함된 줄을 복사할 수 있지만 é캡처 그룹 내에서 검색하고 바꾸는 방법을 잘 모르겠습니다.

이것이 내가 지금까지 얻은 것입니다:

echo 'éva\ntest\nfrédéric' | sed 's/\(.*é.*\)/&\n\1/'

내가 이걸 할 수 있을까 sed? 그렇지 않다면 함께 일하고 싶습니다 awk...

답변1

여러 명령을 일치 é시킨 후 적용할 수 있습니다.

sed '/é/{p;s/é/e/g;}'

포함된 행의 경우 é현재 패턴 공간을 인쇄한 다음 é모든 s를 다음으로 바꿉니다 e(그리고 패턴 공간을 다시 인쇄합니다).

AWK에 해당하는 것은 다음과 같습니다.

awk '/é/{print; gsub(/é/, "e")}1'

seds명령은 주소 패턴을 재사용할 수 있습니다.

sed '/é/{p;s//e/g;}'

대체 항목이 모두 단일 문자 대체인 경우 이 y명령이 더 효율적입니다.

sed '/é/{p;y/é/e/;}'

답변2

$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic

위의 용도는 다음과 같습니다.

  1. 1awk가 현재 행을 인쇄하는 기본 작업을 수행하도록 하는 관용적 true 조건은 다음과 같습니다.
  2. gsub()és를 s로 바꾸고 e, s가 발견/교체되면 é조건부 컨텍스트에서 다시 긍정적인 반환을 사용하면 awk가 현재(현재 수정된) 행을 인쇄하는 기본 작업을 수행하게 됩니다.

의 반환 코드를 사용하여 s가 발견되었는지 gsub()여부를 알려주면 명령에서 동일한 정규식을 반복적으로 지정 é하지 않아도 됩니다 ./é/

답변3

또 다른 sed옵션 - 영감을 받은 것@EdMorton의 awk답변

sed -n 'p;s/é/e/gp' file

답변4

또 다른 옵션,@Stephen Kitt와 유사함:

$ sed '/é/p;s/é/e/g'
éva
eva
test
frédéric
frederic

  • /é/p문자가 있는 줄을 선택 é하고 인쇄합니다.
  • s/é/e/g이전 줄을 인쇄하고 바꾸십시오.

관련 정보