
특정 특수 문자가 포함된 텍스트 파일의 줄을 복제하려고 하는데, 중복된 줄에서 특수 문자를 "일반" 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
대체 항목으로 이전 줄을 인쇄합니다.