Ich habe eine temp
Datei mit Klein- und Großbuchstaben.
Eingang
Inhalt meiner temp
Datei:
hi
Jigar
GANDHI
jiga
Ich möchte alle oberen in untere konvertieren .
Befehl
Ich habe den folgenden Befehl ausprobiert:
sed -e "s/[A-Z]/[a-z]/g" temp
habe aber falsche ausgabe bekommen.
Ausgabe
Ich möchte es als:
hi
jigar
gandhi
jiga
Wofür muss der Ersatzteil des Arguments stehen sed
?
Antworten:
Wenn Ihre Eingabe nur ASCII-Zeichen enthält, können Sie Folgendes verwenden
tr
:oder (weniger leicht zu merken und IMO einzugeben; jedoch nicht beschränkt auf lateinische ASCII-Buchstaben, obwohl in einigen Implementierungen, einschließlich GNU
tr
, weiterhin beschränkt auf Einzelbyte-Zeichen, also in UTF-8-Gebietsschemata, weiterhin beschränkt auf ASCII-Buchstaben):wenn du verwenden musst
sed
:(hier unter der Annahme der GNU-Implementierung).
Bei POSIX
sed
müssen Sie alle Transliterationen angeben und dann können Sie auswählen, welche Buchstaben Sie konvertieren möchten:Mit
awk
:quelle
\L
eine GNU-Erweiterung ist.\L
funktioniert soweit gut bei mir En beleuchten Sie den Punkt, dass Sie versuchen, GNU-Erweiterungsed
ist ein Unix-Befehl. Unterschiedliche Systeme haben unterschiedliche Varianten mit unterschiedlichem Verhalten und unterschiedlicher Funktionalität. Zum Glück gibt es heutzutage einen Standard, der den meisten Anforderungen entspricht, sodass Sie sich auf ein Minimum an Funktionen verlassen können, die allen gemeinsam sind.\L
ist nicht unter ihnen und wurde von GNU eingeführtsed
(entspricht dem gleichen Operator in standardex
/vi
) und ist in der Regel in anderen Implementierungen nicht verfügbar.tr
Implementierungen wie GNUtr
in Mehrbyte-Gebietsschemas nicht richtig funktionieren (die meisten von ihnen sind heutzutage, versuchen Sie esecho STÉPHANE | tr '[:upper:]' '[:lower:]'
zum Beispiel). Auf GNU - Systemen können Sie die bevorzugensed
Variante oderawk
‚stolower()
.sed 's/.*/\L&/g' < input
. Der\1
Verweis auf die übereinstimmende Teilzeichenfolge funktioniert nur, wenn Sie die Teilzeichenfolge in Klammern angeben, wie dies bei wurtle der Fall ist. Es ist jedoch etwas sauberer, um&
das gesamte Spiel darzustellen, wie gezeigtMit vim ist es ganz einfach:
Öffnet die Datei,
gg
geht in die erste Zeile0
, erste Spalte. MitguG
wird die Groß- / Kleinschreibung aller Zeichen bis zum Ende der Datei verringert.ZZ
speichert und beendet.Es sollte fast alles verarbeiten, was Sie darauf werfen. Zahlen werden ignoriert, Nicht-ASCII-Zeichen werden verarbeitet.
Wenn Sie das Gegenteil tun möchten, wandeln Sie die Buchstaben in Großbuchstaben um, tauschen Sie die Buchstaben
u
gegen aU
: aus,gg0gUGZZ
und fertig.quelle
vim file1 file2 fileetc
und dann sowas:bufdo gg0guG:w<CR>
würde wohl für beliebig viele dateien funktionieren. Habe das allerdings nicht getestet!Ich mag
dd
das selbst.... bekommt ...
Das
LC_ALL=C
ist kein multibytes in Eingang zu schützen - auch wenn alle multibyte Kapitelle werden nicht konvertiert. Das Gleiche gilt für (GNU)tr
- beide Apps neigen dazu, in einem Nicht-C-Gebietsschema Unregelmäßigkeiten einzugeben.iconv
kann für eine umfassende Lösung mit beiden kombiniert werden.Der Standardstatusbericht der
2>/dev/null
Umleitung wird verworfendd
- und der dazugehörige Stderr. Andernfallsdd
würde die Fertigstellung eines Auftrags wie oben beschrieben mit Druckinformationen wie der Anzahl der verarbeiteten Bytes usw. erfolgen.quelle
tr
beim Umgang mit großen Dateien, danke!Sie können auch Perl 5 verwenden:
Die Option
-p
weist Perl an, den angegebenen Ausdruck einmal für jede Eingabezeile auszuführen und das Ergebnis, dh den Endwert von, zu drucken$_
.-e
Gibt an, dass das Programm das nächste Argument ist, im Gegensatz zu einer Datei, die das Skript enthält.lc
konvertiert in Kleinbuchstaben. Ohne ein Argument wird es weiterarbeiten$_
. Und$_=
speichert es erneut, damit es gedruckt wird.Eine Variation davon wäre
Verwenden
-n
ist wie-p
nur, dass$_
es am Ende nicht gedruckt wird. Anstatt diese Variable zu speichern, füge ich eine explizite print-Anweisung hinzu.Ein Vorteil von Perl im Gegensatz zu sed ist, dass Sie keine GNU-Erweiterungen benötigen. Es gibt Projekte, die mit Nicht-GNU-Umgebungen kompatibel sein müssen, aber auch bereits Perl als Abhängigkeit haben. Im Vergleich
tr
dazu könnte es sein, dass Perllc
leichter für das Gebietsschema sensibilisiert werden kann.perllocale
Einzelheiten finden Sie auf der Manpage.quelle
Sie müssen das übereinstimmende Muster erfassen und dann in der Ersetzung durch einen Modifikator verwenden:
Das
\(...\)
"erfasst" den einschließenden passenden Text, das erste Capture geht an\1
, das nächste an\2
usw. Die Nummerierung richtet sich nach den öffnenden Klammern bei verschachtelten Captures.Das
\L
konvertiert das erfasste Muster in Kleinbuchstaben, es gibt auch\U
Großbuchstaben.quelle
&
Nach der Antwort von MvG können Sie auch Perl 6 verwenden:
perl6 -pe .=lc temp
Hier ist $ _ implizit und Sie brauchen keine einfachen Anführungszeichen, um es vor der Erweiterung durch die Shell zu schützen ($ _ ist ein spezieller Bash-Parameter; siehe: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
quelle