Buchstaben%20in%20Gro%C3%9Fbuchstaben%20in%20Kyrillisch.png)
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 vim
oder sed
verwendet 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
\k
stimmt mit alphanumerischen Zeichen und überein _
. Das weit verbreitete \w
ist 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 \1
bzw. 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>
\b
stimmt mit Wortgrenzen in überein sed
, der Rest ist identisch mit der vim
Version. (Getestet auf GNU sed, die Zeichenklassen werden möglicherweise nicht in allen sed
Versionen 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 verschiebengue
-- jeden Buchstabengu
bis zum Ende des aktuellen Wortes in Kleinbuchstaben umwandeln (das ist das ) (e
)w
-- gehe zum ersten Buchstaben des nächsten Wortesq
-- Stoppen Sie die Aufzeichnung des Makros
Sie können das Makro mit aufrufen @q
. Sie können es neunmal mit 9@q
oder 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 desq
Makros und stoppt die Aufzeichnung dann sofort wieder, wodurch das Register effektiv gelöscht wird@q
-- ruft dasq
Makro 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).