유니 코드를 지원하는 sed의 대안이 있습니까?


33

예를 들면 다음과 같습니다.

sed 's/\u0091//g' file1

지금 hexdump은 16 진수를 얻고 sed다음과 같이 입력해야 합니다.

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003

그리고:

$ sed 's/\xe9\xa6\x91//g' file1

답변:


28

해당 구문을 사용하십시오.

sed 's/馑//g' file1

또는 탈출 된 형태로 :

sed "s/$(echo -ne '\u9991')//g" file1

(이전 버전의 Bash 및 일부 셸은 이해하지 못 echo -e '\u9991'하므로 먼저 확인하십시오.)


1
sed는 馑을 하나의 문자 또는 3으로 간주합니까? 즉, echo 馑 | sed s/...//아무것도 인쇄합니까?
user253751

@immibis sedg 수정자가 있기 때문에 서로 따르는 경우에도 모든 발생을 대체합니다. 또한 sed는 한 문자로 계산해야 echo -ne "馑" | wc -m합니다 1. gives를 참조하십시오 . 바이트 wc -c수를 세면 반환 3됩니다. 귀하의 질문을 올바르게 이해 했습니까?
혼돈

나는 의미 : 않습니다 .평균 "하나 개의 문자"또는 "한 바이트?"
user253751

@immibis 나는 하나의 문자와 일치하므로 echo 馑 | sed s/...//나에게 아무것도주지 않습니다 (아무것도 대체되지 않습니다)
혼돈

4
@chaos : 아래 en_US.UTF-8에서 작동 하지만 아래 에서는 작동 하지 않습니다 C.
choroba

15

펄은 그렇게 할 수있다 :

echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'

-CS 표준 입력, 출력 및 오류에 대해 UTF-8을 켭니다.


7
펄은 거의 모든 일을 할 수있다 .....
wobbily_col

6

다양한 버전의 sed지원 유니 코드 :

  • "원래 유닉스 자료"를 기반으로 한 가보 sed .
  • GNU sed 는 자체 코드베이스입니다.
  • 유닉스 계열 운영체제로 포팅 된 Plan 9 sed

BSD sed에 대한 정보를 찾을 수 없었습니다. 이상하다고 생각했지만 유니 코드도 지원할 가능성이 높다고 생각합니다. 불행히도, sed어떤 인코딩을 사용할 것인지를 결정하는 표준 방법이 없으므로 각 인코딩은 고유 한 방식으로 수행합니다.


BOM이 있거나없는 UTF-16을 지원합니까?
Bon Ami

10
UTF-16은 유닉스 기반 OS에서는 사용할 수 없습니다. 또한 하루의 빛을 보지 못했던 가증 한 일이기도합니다.
Brian Bi

UTF-16을 지원하는지 여부는 구현에 따라 다르며 해당 데이터가없는 것이 걱정됩니다. 나는 계획 9 sed (원래 OS는 UTF-8)를 의심하지만 확실하지는 않지만 확실하지 않더라도 다른 사람들은 할 수 있습니다.
Spooniest

2

이것은 나를 위해 작동합니다 :

$ vim -nEs +'%s/\%u9991//g' +wq file1

내가 원하는 것보다 더 장황하다. 전체 설명은 다음과 같습니다.

  • -n vim 스왑 파일 비활성화
  • -E 전 개선 된 모드
  • -s 무음 모드
  • +'%s/\%u9991//g' 대체 명령을 실행
  • +wq 저장하고 종료

나는 이것이 제 file1 위치에서 수정한다고 가정 한다. 맞습니까?
gerrit

@gerrit 맞습니다. 지적 해 주셔서 감사합니다.
Aryeh Leib Taurog

1

최신 버전의 BASH에서는 sed 표현식 주위의 따옴표를 생략하면 BASH의 이스케이프 된 문자열을 사용할 수 있습니다. 와일드 카드로 BASH에서 해석 될 수있는 sed 표현식 또는 sed 표현식의 일부 공간은 개별적으로 인용 될 수 있습니다.

$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻

이것은 간단하고 깨끗한 새로운 대답이어야합니다!
앨런 왕

0

GNU sed (버전 4.2.1)에서 저에게 효과적입니다.

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

(의 다른 대체품으로서 sed GNU를 사용할 수도 awk있지만 꼭 필요한 것은 아닙니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.