특정 특수 문자가 포함된 텍스트 파일의 줄을 복사하려고 하는데 복사본에서 특수 문자가 "일반" 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'
sed
이 s
명령은 주소 패턴을 재사용할 수 있습니다.
sed '/é/{p;s//e/g;}'
대체 항목이 모두 단일 문자 대체인 경우 이 y
명령이 더 효율적입니다.
sed '/é/{p;y/é/e/;}'
답변2
$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic
위의 용도는 다음과 같습니다.
1
awk가 현재 행을 인쇄하는 기본 작업을 수행하도록 하는 관용적 true 조건은 다음과 같습니다.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
이전 줄을 인쇄하고 바꾸십시오.