Có một sự thay thế cho sed hỗ trợ unicode?


33

Ví dụ:

sed 's/\u0091//g' file1

Ngay bây giờ, tôi phải làm hexdumpđể có được số hex và đưa vào sednhư sau:

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

Và sau đó:

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

Câu trả lời:


28

Chỉ cần sử dụng cú pháp đó:

sed 's/馑//g' file1

Hoặc ở dạng thoát:

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

(Lưu ý rằng các phiên bản cũ hơn của Bash và một số shell không hiểu echo -e '\u9991', vì vậy hãy kiểm tra trước.)


1
Liệu sed có tính 馑 là một ký tự hay 3 không? Đó là, có echo 馑 | sed s/...//in gì không?
dùng253751

@immibis Kể từ khi sedcó công cụ sửa đổi g, nó cũng thay thế tất cả các lần xuất hiện khi chúng theo nhau. Ngoài ra sed nên tính nó là một nhân vật, xem: echo -ne "馑" | wc -mcho 1. Nếu bạn đếm byte ( wc -c) nó sẽ trả về 3. Tôi đã hiểu chính xác câu hỏi của bạn?
hỗn loạn

Ý tôi là: có .nghĩa là "một ký tự" hay "một byte"?
user253751

@immibis Tôi phù hợp với một nhân vật do đó echo 馑 | sed s/...//mang lại cho tôi (không có gì được thay thế)
hỗn loạn

4
@chaos: Nó hoạt động theo en_US.UTF-8, nhưng không dưới C.
choroba

15

Perl có thể làm điều đó:

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

-CS bật UTF-8 cho đầu vào, đầu ra và lỗi tiêu chuẩn.


7
Perl có thể làm hầu hết mọi thứ .....
wobbily_col

6

Một số phiên bản sedhỗ trợ Unicode :

  • Gia truyền sed , dựa trên "tài liệu Unix gốc".
  • GNU sed , đó là cơ sở mã riêng của nó.
  • Plan 9 sed , đã được chuyển sang các hệ điều hành giống Unix.

Tôi không thể tìm thấy thông tin về BSD sed, điều mà tôi nghĩ là lạ, nhưng tôi nghĩ rằng tỷ lệ cược là tốt vì nó cũng hỗ trợ Unicode. Thật không may, không có cách tiêu chuẩn nào để nói sedmã hóa nào sẽ được sử dụng, vì vậy mỗi người thực hiện việc này theo cách riêng của mình.


Họ có hỗ trợ UTF-16 có và không có BOM không?
Bon Ami

10
UTF-16 khá không sử dụng được trong các HĐH dựa trên Unix. Đó cũng là một điều kinh tởm đáng lẽ không bao giờ nhìn thấy ánh sáng trong ngày.
Brian Bi

Việc họ có hỗ trợ UTF-16 hay không phụ thuộc vào việc triển khai và tôi sợ rằng tôi không có dữ liệu đó. Tôi nghi ngờ rằng sed 9 của Plan 9 (hệ điều hành gốc là UTF-8 ở mọi nơi), nhưng tôi không thể chắc chắn, và ngay cả khi nó không, những cái khác có thể.
Chiếc thìa ngon nhất

2

Điều này làm việc cho tôi:

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

Đó là một giọt dài hơn so với tôi muốn; đây là một lời giải thích đầy đủ:

  • -n vô hiệu hóa tập tin hoán đổi vim
  • -E Chế độ cải tiến cũ
  • -s chế độ im lặng
  • +'%s/\%u9991//g' thực hiện lệnh thay thế
  • +wq lưu và thoát

Tôi cho rằng điều này sửa đổi file1 tại chỗ , điều đó có đúng không?
gerrit

@gerrit đó là chính xác, và cảm ơn vì đã chỉ ra nó.
Aryeh Leib Taurog

1

Với các phiên bản gần đây của BASH, chỉ cần bỏ qua các trích dẫn xung quanh biểu thức sed và bạn có thể sử dụng các chuỗi thoát của BASH. Các không gian trong biểu thức sed hoặc các phần của biểu thức sed có thể được BASH diễn giải vì các ký tự đại diện có thể được trích dẫn riêng.

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

Đây phải là câu trả lời mới được chấp nhận, đơn giản và sạch sẽ!
Allen Wang

0

Hoạt động với tôi với GNU sed (phiên bản 4.2.1):

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

(Là một sự thay thế khác cho sedbạn cũng có thể sử dụng GNU awk; nhưng có vẻ như không cần thiết.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.