Câu trả lời:
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.)
sed
có 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 -m
cho 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?
.
nghĩa là "một ký tự" hay "một byte"?
echo 馑 | sed s/...//
mang lại cho tôi 馑
(không có gì được thay thế)
en_US.UTF-8
, nhưng không dưới C
.
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.
Một số phiên bản sed
hỗ trợ Unicode :
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 sed
mã 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.
Đ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átfile1
tại chỗ , điều đó có đúng không?
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
饥荐臻
echo 馑 | sed s/...//
in gì không?