it-swarm.com.de

So entfernen Sie alle diakritischen Zeichen aus einer Datei?

Ich habe eine Datei mit vielen Vokalen mit Diakritikern. Ich muss diese Ersetzungen vornehmen:

  • Ersetzen Sie ā, á, and und à durch ein.
  • Ersetzen Sie ē, é, ě und è durch e.
  • Ersetzen Sie ī, í, ǐ und ì durch i.
  • Ò, ó, ǒ und ò durch o ersetzen.
  • Ersetzen Sie ū, ú, ǔ und ù durch u.
  • Ersetzen Sie ǖ, ǘ, ǚ und ǜ durch ü.
  • Ersetzen Sie Ā, Á, Ǎ und À durch A.
  • Ersetzen Sie Ē, É, und È durch E.
  • Ersetzen Sie Ī, Í, Ǐ und Ì durch I.
  • Ersetzen Sie Ō, Ó, Ǒ und Ò durch O.
  • Ersetzen Sie Ū, Ú, Ǔ und Ù durch U.
  • Ersetzen Sie Ǖ, Ǘ, Ǚ und Ǜ durch Ü.

Ich weiß, dass ich sie einzeln damit ersetzen kann:

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

Gibt es eine effizientere Möglichkeit, all diese zu ersetzen?

30
Village

Wenn Sie die Manpage des Tools iconv überprüfen:

// TRANSLIT
Wenn der String "// TRANSLIT" an --to-code angehängt wird, wird die Transliteration aktiviert. Das bedeutet, wenn ein Zeichen nicht in der .__ dargestellt werden kann. Zielzeichensatz kann er durch ein oder mehrere ähnlich aussehende Zeichen angenähert werden.

so könnten wir tun:

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.
48
Kent

Das könnte für Sie funktionieren:

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

Ich mag iconv, da es alle Akzentvariationen behandelt:

cat non-ascii.txt | iconv -f utf8 -t ascii//TRANSLIT//IGNORE > ascii.txt
7
Fedir RYKHTIK

Hierfür ist der Befehl tr (1) für. Zum Beispiel:

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

Möglicherweise müssen Sie Ihre Umgebungsvariable LANG prüfen/ändern, um sie dem verwendeten Zeichensatz anzupassen.

2
ktf

Sie können so etwas verwenden:

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

fügen Sie einfach weitere Zeichen zu [..] hinzu. 

2
hungnv

Sie können man iso_8859_1 (oder Ihren Zeichensatz) oder od -bc verwenden, um die oktale Darstellung des Diakritischen Zeichens zu identifizieren. Verwenden Sie dann gawk, um das Ersetzen durchzuführen.

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

Dies ersetzt ä durch a.

1
Rich Traube

Wenn Sie wie ich die Akzente nur an bestimmten Stellen Ihres Datei-Texts ersetzen müssen, können Sie dies mit dieser Art von Regex tun

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'

Ausgabe

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

Das kann nicht funktionieren. Nur weil Ihr Gebietsschema gesetzt sein muss!

verwenden Sie locale zum Festlegen von LC_ALL. Beispiel:

export LC_ALL=en_US.iso88591

Beachten Sie, dass die vollständige Liste der Gebietsschemata verfügbar ist durch:

locale -a
0
Bruno