sed Einzeiler, um alle Großbuchstaben in Kleinbuchstaben umzuwandeln?

131

Ich habe eine Textdatei, in der einige Wörter in Großbuchstaben gedruckt sind. Ich möchte in der Lage sein, alles in der Textdatei einfach in Kleinbuchstaben umzuwandeln sed. Das bedeutet, dass der erste Satz dann lauten würde: "Ich habe eine Textdatei, in der einige Wörter in Großbuchstaben gedruckt sind."

magnetar
quelle
6
Kennen Sie den trBefehl? Manchmal ist es besser geeignet als sed.
Bryan Oakley
@ Bryan Oakley war ich bis jetzt nicht. Vielen Dank für den Hinweis. Aber wie verwende ich es, um das zu tun, was ich gefragt habe?
Magnetar
Schauen Sie in den Link in Raghurams Antwort.
Bryan Oakley
1
Wenn Sie sed verwenden müssen, geben Sie cat <input> | ein sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Sie müssen alle Zeichen in Groß- und Kleinbuchstaben angeben. Ich weiß, dass es umständlich ist, all diese Zeichen zu schreiben, aber es funktioniert auch mit all diesen internationalen Sonderzeichen. :)
Arno Teigseth

Antworten:

248

Mit tr:

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

Funktioniert mit GNU sed(BSD sedunterstützt nicht \L \U):

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt
magnetar
quelle
6
Ich musste meine eigene Antwort wählen, weil ich kein Fan von Antworten bin, die nur aus Links bestehen.
Magnetar
6
OSX unterstützt auch nicht die GNU-Erweiterungen :(
ekkis
2
sed -e 's/.*/\L&/' input.txt > output.txtfür GNU sed funktioniert auch gut
Asfand Qazi
1
@ekkis OSX verwendet BSD (wie bereits erwähnt, unterstützt BSD sed dies nicht). Lesen Sie die oberste Zeile von, um man sedzu erfahren, welche Version Sie verwenden.
Ryder
Aus irgendeinem Grund, wenn ich Ihr Großbuchstabenmuster verwende, fügt es Uvor jeder Zeile ein
Xtremefaith
51

Wenn Sie GNU-Erweiterungen haben, können Sie sed's \ L (niedrigeres gesamtes Match oder bis \ L [niedriger] oder \ E [Ende - Gehäuse ausschalten] erreicht) verwenden, wie folgt:

sed 's/.*/\L&/' <input >output

Hinweis: '&' bedeutet das vollständige Übereinstimmungsmuster.

Als Randnotiz enthalten die GNU-Erweiterungen \ U (oben), \ u (oberes nächstes Übereinstimmungszeichen), \ l (unteres nächstes Übereinstimmungszeichen). Zum Beispiel, wenn Sie einen Satz camelcase wollten:

$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

Hinweis: Da davon ausgegangen wird, dass wir GNU-Erweiterungen haben, können wir auch die Option dash-r (erweiterte reguläre Ausdrücke) verwenden, die \ w (Wortzeichen) zulässt und Sie davon befreit, sich der Erfassungsklammer und einer oder mehreren zu entziehen Quantifizierer (+). (Nebenbei: \W [non-word], \s [whitespace], \S [non-whitespace]auch mit strich r unterstützt, aber \d [digit]und \D [non-digit]sind es nicht.)

Luv2code
quelle
1
Sehr nützlicher Tipp. Ich habe festgestellt, dass die runden Klammern im Kamelfallbeispiel nicht benötigt werden. 's / \ w + / \ u & / g' funktioniert auch.
PJ_Finnegan
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- Wenn Sie den /iModifikator verwenden, wird die Übereinstimmung zwischen Groß- und Kleinschreibung nicht berücksichtigt und ist daher optional. Der -iSchalter weist sed an, die Datei an Ort und Stelle zu ändern. Sie müssen die Ausgabe nicht in eine andere Datei umleiten, wenn Sie dies nicht müssen.
Jim
1
Ich brauchte das wirklich \E [end - toggle casing off]. Danke !
Mehdi Yedes
37

Sie können dies auch sehr einfach tun awk, wenn Sie bereit sind, ein anderes Tool in Betracht zu ziehen:

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
quelle
1
Die beste Antwort, weil Sie mit Kyrillisch arbeiten. tr: - hat nicht damit gearbeitet.
Amaroc
2
Achten Sie auf Charaktere mit Akzenten. tolowerwürde nicht in der Lage zu handhaben Àzum Beispiel
Sam Houston
Sie können eine Reihe von Dateien mit diesem Befehl umbenennen: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus
15

Hier sind viele Lösungen:

Mit Perl, Tr, Sed und Awk upercaser

perl -ne 'print uc'
perl -npe '$_=uc'
perl -npe 'tr/[a-z]/[A-Z]/'
perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

Mit Perl, Tr, Sed und Awk in Kleinbuchstaben schreiben

perl -ne 'print lc'
perl -npe '$_=lc'
perl -npe 'tr/[A-Z]/[a-z]/'
perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\L\1/g'
sed 's/.*/\L&/'
awk '{print tolower($0)}'

Komplizierte Bash in Kleinbuchstaben:

while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done

Komplizierte Bash in Großbuchstaben:

while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done

Einfache Bash in Kleinbuchstaben:

while read v;do echo "${v,,}"; done

Einfache Bash in Großbuchstaben:

while read v;do echo "${v^^}"; done

Beachten Sie, dass $ {v,} und $ {v ^} nur den ersten Buchstaben ändern.

Sie sollten es so verwenden:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
Vouze
quelle
7
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Ausgabe:

Hallo, mein Name ist Sujit
Sujit Dhamale
quelle
5

Ich mag einige der Antworten hier, aber es gibt einen sed-Befehl, der auf jeder Plattform den Trick machen sollte:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Wie auch immer, es ist leicht zu verstehen. Und das Wissen über den Befehl y kann manchmal nützlich sein.

Dennis
quelle
2
Dies funktioniert nicht für beliebige internationale Zeichen, aber für ASCII-Zeichen in OS / X
emrys57
Es hat sicherlich den Job für mich gemacht. Ich muss zugeben, dass ich den Befehl y zum ersten Mal verwendet habe. Vielen Dank!
Monsun
4

Wenn Sie posix sed verwenden

Auswahl für jeden Fall für ein Muster (Konvertieren des gesuchten Musters mit diesem Sed, als das konvertierte Muster in dem gewünschten Befehl mit Regex zu verwenden:

echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern
 YourInputStreamCommand | egrep "${MyNewPattern}"

in Kleinbuchstaben konvertieren

sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"

Gleiches gilt für Großbuchstaben. Ersetzen Sie den unteren Buchstaben zwischen // durch das obere Äquivalent im sed

Habe Spaß

NeronLeVelu
quelle
(Ich fand, dass dieses unter MacOS am besten funktioniert) - Schön, mein Freund - aber ein winziger Topo - Sie haben den Jj-Fall rückwärts. Sollte sediert werden "s / [aA] / a / g; s / [bB] / b / g; s / [cC] / c / g; s / [dD] / d / g; s / [eE] / e / g; s / [fF] / f / g; s / [gG] / g / g; s / [hH] / h / g; s / [iI] / i / g; s / [jJ] / j / g; s / [kK] / k / g; s / [lL] / l / g; s / [mM] / m / g; s / [nN] / n / g; s / [oO] / o / g; s / [pP] / p / g; s / [qQ] / q / g; s / [rR] / r / g; s / [sS] / s / g; s / [tT] / t / g; s / [uU] / u / g; s / [vV] / v / g; s / [wW] / w / g; s / [xX] / x / g; s / [yY] / y / g; s / [zZ] / z / g "
Neil McGill
Ich bin mir nicht sicher, warum Sie etwas so arbeitsintensives tun müssen. Ich gehe davon aus, dass Mac OS keine GNU-Erweiterungen hat, aber wenn Sie fest entschlossen sind, sed anstelle von Substitutionen zu verwenden, können Sie die Transliteration ('y') wie folgt verwenden: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
Das Ziel war es, jedes Textmuster, das wie ein Klein- / Großbuchstabe aussieht, aus einem Nicht-GNU-Sed auszuwählen, ohne den Inhalt der Datenquelle zu y//ändern (eine Änderung des Inhalts der Quelle oder die
Fehlersuche zu
3

kurz, süß und du brauchst nicht mal umzuleiten :-)

perl -p -i -e 'tr/A-Z/a-z/' file
pedrito
quelle
Hah, nun, ich habe versucht, dies mit einem Blick nach hinten zu verwenden, und es hat irgendwie die meisten Buchstaben in meinen Dateien durch andere zufällige Großbuchstaben ersetzt. Hat mich trotzdem gut gelacht. Ich konnte aus dieser Antwort auch über Perl ableiten, was ich wollte: askubuntu.com/a/527073/250556
ThorSummoner