줄을 복제하고 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대체 항목으로 이전 줄을 인쇄합니다.

관련 정보