Gegeben:
main_east_library
main_west_roof
main_north_roof
minor_south_roof
Wie kann ich verwendet sed
(genauer gesagt, nicht awk
, tr
etc.) zu erstellen:
main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof
Etwas wie:
$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_'
Obwohl das gibt:
sed: -e expression #1, char 16: Invalid back reference
Antworten:
Mit GNU
sed
:Würde die dritte Folge von Buchstaben aus jeder Zeile groß schreiben.
So schreiben Sie jede dritte Buchstabenfolge in jeder Zeile groß :
So schreiben Sie mit GNU jede dritte Buchstabenfolge in der gesamten Eingabe groß
awk
:Oder mit
perl
:Während die
[[:alpha:]]
Zeichenklasse auf einigen Systemen etwas zufällig sein kann (z. B. auf GNU-Systemen, die viele Ziffern enthalten, mit Ausnahme der arabischen (0123456789)),\p{...}
basiert Perl auf Unicode-Zeicheneigenschaften. Diese\p{alpha}
enthalten also Buchstaben in allen Alphabeten sowie alphabetische Zeichen ohne Buchstaben.Es wird jedoch keine Kombination von Diakritika enthalten, was bedeutet, dass Wörter wie
Stéphane
als zwei separate Wörter betrachtet werden.Vielleicht möchten Sie stattdessen:
Dies kann jedoch zu vielen führen.
Beachten Sie auch, dass
sed
Perl im Gegensatz zu GNU\u
Wörter wiefiddle
(wobeifi
ein Ligaturzeichen ist) korrekt inFiddle
(2 ZeichenF
undi
) umwandelt .quelle
Perl
Es werden 2 Zeichenfolgen gezählt, die mit einem Unterstrich enden, und dann das nächste Zeichen in Großbuchstaben geschrieben.
quelle
Ein weiteres GNU
sed
:Dies setzt voraus, dass die Zeile immer mit einem Wort beginnt.
quelle