2012-04-18 40 views
24

Tôi có một tệp chứa nhiều nguyên âm có dấu phụ. Tôi cần thực hiện các thay thế này:Làm thế nào để loại bỏ tất cả các dấu phụ từ một tập tin?

  • Thay thế å, á, ǎ và à bằng a.
  • Thay thế ē, é, ě và è bằng e.
  • Thay thế ī, í, ǐ và ì bằng i.
  • Thay thế ō, ó, ǒ và ò bằng o.
  • Thay thế ū, ú, ǔ và ù bằng u.
  • Thay thế ǖ, ǘ, ǚ và ǜ bằng ü.
  • Thay thế là, một, Ǎ và với A.
  • Thay E, E, E, và E với E.
  • Thay i, i, Ǐ, và tôi với I.
  • Thay O , Ó, Ǒ, và Ò với O.
  • Thay thế Ū, Ú, Ǔ và Ù bằng U.
  • Thay thế Ǖ, Ǘ, Ǚ và Ǜ bằng Ü.

Tôi biết tôi có thể thay thế chúng cùng một lúc với điều này:

sed -i 's/ā/a/g' ./file.txt 

Có cách nào hiệu quả hơn để thay thế tất cả các?

+3

sed có thể không phải là công cụ tốt nhất cho công việc này; iconv có lẽ tốt hơn. xem: http://stackoverflow.com/questions/8562354/remove-unicode-characters-from-textfiles-sed-other-bash-shell-methods – geoffspear

Trả lời

43

Nếu bạn kiểm tra xem man page của công cụ iconv:

// TRANSLIT
Khi chuỗi "// TRANSLIT" được gắn vào --Để-mã, phiên âm được kích hoạt. Điều này có nghĩa là khi một ký tự không thể được biểu diễn trong bộ ký tự đích , nó có thể được xấp xỉ thông qua một hoặc nhiều ký tự trông giống nhau.

vì vậy chúng tôi có thể làm:

kent$ cat test1 
    Replace ā, á, ǎ, and à with a. 
    Replace ē, é, ě, and è with e. 
    Replace ī, í, ǐ, and ì with i. 
    Replace ō, ó, ǒ, and ò with o. 
    Replace ū, ú, ǔ, and ù with u. 
    Replace ǖ, ǘ, ǚ, and ǜ with ü. 
    Replace Ā, Á, Ǎ, and À with A. 
    Replace Ē, É, Ě, and È with E. 
    Replace Ī, Í, Ǐ, and Ì with I. 
    Replace Ō, Ó, Ǒ, and Ò with O. 
    Replace Ū, Ú, Ǔ, and Ù with U. 
    Replace Ǖ, Ǘ, Ǚ, and Ǜ with Ü. 


kent$ iconv -f utf8 -t ascii//TRANSLIT test1 
    Replace a, a, a, and a with a. 
    Replace e, e, e, and e with e. 
    Replace i, i, i, and i with i. 
    Replace o, o, o, and o with o. 
    Replace u, u, u, and u with u. 
    Replace u, u, u, and u with u. 
    Replace A, A, A, and A with A. 
    Replace E, E, E, and E with E. 
    Replace I, I, I, and I with I. 
    Replace O, O, O, and O with O. 
    Replace U, U, U, and U with U. 
    Replace U, U, U, and U with U. 
+3

Điều này hoạt động tốt, ngoại trừ tôi chỉ muốn các dấu hiệu biến mất khỏi ü, nhưng không phải là âm sắc. – Village

+0

Kent, tôi muốn thêm một liên kết trực tiếp cho trang "man" cho 'iconv' - nhưng không có cái nào tôi tìm thấy chứa trích dẫn cụ thể đó. Bạn có muốn thêm nơi bạn đã nhận nó từ đâu không? – usr2564301

+1

từ 'man iconv'. Trong câu trả lời tôi cũng đề cập đến trang người đàn ông của iconv. Phiên bản hiện tại của tôi là 'iconv (GNU libc) 2.21' Nhưng câu trả lời đã được đăng cách đây 3 năm, tôi không biết mình đã có phiên bản nào. @Jongware – Kent

2

Đối với điều này, tr (1) lệnh dành cho. Ví dụ:

tr 'āáǎàēéěèīíǐì...' 'aaaaeeeeiii...' <infile >outfile 

Bạn có thể phải kiểm tra/thay đổi biến môi trường LANG để phù hợp với bộ ký tự đang được sử dụng.

2

Bạn có thể sử dụng một cái gì đó như thế này:

sed -e 's/[àâ]/a/g;s/[ọõ]/o/g;s/[í,ì]/i/g;s/[ê,ệ]/e/g' 

chỉ cần thêm nhân vật khác để [..] cho nhu cầu của bạn.

6

Điều này có thể làm việc cho bạn:

sed -i 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/' file 
+0

Đó là cách duy nhất làm việc _out-of-the-box_ – ATorras

+0

Điều thú vị nếu bạn là trên máy Mac, bạn sẽ phải thêm cờ -e vào dòng lệnh. Thêm thông tin: http://stackoverflow.com/questions/16745988/sed-command-works-fine-on-ubuntu-but-not-mac – MrWashinton

6

Tôi thích iconv như nó xử lý tất cả các biến giọng:

cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//IGNORE > ascii.txt 
0

Điều này có thể không hoạt động. Chỉ vì ngôn ngữ của bạn phải được thiết lập!

ngôn ngữ sử dụng để thiết lập LC_ALL, ví dụ:

export LC_ALL=en_US.iso88591 

Lưu ý rằng toàn bộ danh sách ngôn ngữ có sẵn thông qua:

locale -a 
0

Nếu bạn, như tôi, cần phải thay thế các dấu chỉ ở một số vị trí đặc biệt trong văn bản tệp của bạn, bạn có thể làm điều đó bằng cách sử dụng loại regex này

echo '{"doNotReplaceKey":"bábögêjírù","replaceValueKey":"bábögêjírù","anotherNotReplaceKey":"bábögêjírù"}' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[áâàãä]/replaceValueKey":"\1a/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[éêèë]/replaceValueKey":"\1e/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[íîìï]/replaceValueKey":"\1i/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[óôòõö]/replaceValueKey":"\1o/g;ta' \ 
    | sed -e ':a;s/replaceValueKey":"\([a-zA-Z0-9 -_]*\)[úûùü]/replaceValueKey":"\1u/g;ta' 

Ou tput

{"doNotReplaceKey":"bábögêjírù","replaceValueKey":"babogejiru","anotherNotReplaceKey":"bábögêjírù"} 
1

Bạn có thể sử dụng man iso_8859_1 (hoặc bộ char của bạn) hoặc od -bc để xác định các đại diện bát phân của dấu phụ. Sau đó sử dụng gawk để thực hiện thay thế.

{ gsub(/\344/,"a"; print $0 } 

Điều này thay thế ä bằng a.

Các vấn đề liên quan