Alle Buchstaben außer dem ersten (Groß-)Buchstaben in Großbuchstaben in Kyrillisch

Alle Buchstaben außer dem ersten (Groß-)Buchstaben in Großbuchstaben in Kyrillisch

Um alle Buchstaben außer dem ersten Buchstaben klein zu machen. Der erste Buchstabe würde nach der Änderung wie ein „Großbuchstabe“ aussehen (von GROSSBUCHSTABEN in Kyrillisch). Den Rest (nicht GROSSBUCHSTABEN) lasse ich unverändert.

Es tut mir leid, dass es in kyrillischer Schrift ist. zB ABRAZI ABRAZI

Ich habe den richtigen allgemeinen Befehl eingegeben:

:%s/\<\u\zs\u*/\L&/g

Und es hat nicht funktioniert

Mein Linux ist Gentoo, mein Gebietsschema ist echo $LANG en_US.UTF-8.

Ich habe auch versucht:

 %s/\<[А-Я]\zs\[А-Я][а-я]*...

Ich weiß nicht, wie ich diese Syntax richtig verwenden soll. Ich denke, es könnte funktionieren.

Ich verstehe es nicht, auch nach

:se noic /[[:upper:]] 

funktioniert nicht. Muss eine Sache des Standorts sein (frage ich mich).

sed -n '322p' geod.txt | cut -f 1 -d " " 
АВГИТИТ—
sed -n '322p' geod.txt | cut -f 1 -d " " | xxd
0000000: d090 d092 d093 d098 d0a2 d098 d0a2 e280

Allerdings haben alle Buchstaben die gleiche Größenordnung wie die Unicode-Nummerierung.

Ich habe nochmal nachgeschaut:

file -bi geod.txt
text/plain; charset=utf-8

Mit UTF-8 ist es also in Ordnung (obwohl bei „Datei“ etwas schiefgehen könnte).

Hier ist meine Quelldatei: http://bpaste.net/show/140967/

Antwort1

BEARBEITEN:Da es einige Verwirrung darüber gibt, ob vimoder sedverwendet werden sollte, biete ich Lösungen für beides an:

Vim

Die folgende Ersetzung ersetzt die Wörter mit Ausnahme des ersten Buchstabens durch Kleinbuchstaben. Einbuchstabige Wörter werden in Großbuchstaben umgewandelt.

:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g

\kstimmt mit alphanumerischen Zeichen und überein _. Das weit verbreitete \wist gleichwertig mit [A-Za-z0-9_]und schlägt bei kyrillischen Buchstaben fehl.

Die \<und \>erfassen die Wortgrenzen und die Klammern gruppieren die Übereinstimmung in den ersten Buchstaben und den Rest, der jeweils mit \1bzw. abgerufen wird \2.

Damit dieses Muster funktioniert, müssen Sie vim für die Verwendung von UTF-8 einrichten.

set encoding=utf-8

Sed

sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g' <inputfile>

\bstimmt mit Wortgrenzen in überein sed, der Rest ist identisch mit der vimVersion. (Getestet auf GNU sed, die Zeichenklassen werden möglicherweise nicht in allen sedVersionen unterstützt.)

Antwort2

Dies kann mit regulären Ausdrücken erfolgen, und die vorhandene Antwort deckt diese Methode vollkommen ab, es gibt jedoch einen anderen Ansatz.

Gehen Sie bei einem einzelnen Wort einfach zum ersten Buchstaben des Wortes und verwenden Sie:

lgue

Um mehr als ein Wort zu erstellen, müssen Sie ein Makro verwenden

qqlguewq

Ich werde es aufschlüsseln:

  • qq-- Starten Sie die Aufzeichnung eines Makros namensq
  • l(das ist ein kleines L) -- ein Zeichen nach rechts verschieben
  • gue-- jeden Buchstaben gubis zum Ende des aktuellen Wortes in Kleinbuchstaben umwandeln (das ist das ) ( e)
  • w-- gehe zum ersten Buchstaben des nächsten Wortes
  • q-- Stoppen Sie die Aufzeichnung des Makros

Sie können das Makro mit aufrufen @q. Sie können es neunmal mit 9@qoder zweiundvierzigmal mit aufrufen 42@q. Bei diesem speziellen Makro können Sie es bedenkenlos beliebig oft aufrufen – Sie könnten also verwenden 9999@q.

Ein anderer Weg ist ein rekursives Makro:

qqqqqlguew@qq
  • qqq- beginnt mit der Aufzeichnung des qMakros und stoppt die Aufzeichnung dann sofort wieder, wodurch das Register effektiv gelöscht wird
  • @q-- ruft das qMakro auf, das jetzt leer ist, abernichtsobald Sie die Aufzeichnung des Makros beenden
  • Der Rest verhält sich wie oben

Wenn das Makro das Ende des letzten Wortes im Dokument erreicht, wird es beendet (wie bei jedem Fehler dieser Art – andernfalls würde es für immer fortgesetzt).

verwandte Informationen