So suchen, ersetzen und hängen Sie ein Muster an das Ende jeder Zeile an

So suchen, ersetzen und hängen Sie ein Muster an das Ende jeder Zeile an

Ich habe die folgende Liste mit Artikeln:

bigBone
fishMarket
dogCollar
...

Ich muss eine Zwei-Zeichen-Zuordnung wie diese generieren:

bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...

Wie kann ich die obige Zuordnung mithilfe von erstellen sed?

Ich habe so etwas versucht:

sed -i -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/' file

ich sahdiese Frage, aber ich bin nicht sicher, wie ich das Konzept hier integrieren soll. Danke.

Antwort1

Wenn ich Sie richtig verstehe, möchten Sie die gesamte Zeile behalten und nur etwas anhängen:

sed -r 's/^([a-z]{1})([a-z]+)([A-Z]{1})([a-zA-Z]+)$/\1\2\3\4 -> \1\L\3/' file

bearbeiten:

devnull musste mich daran erinnern, dass es dafür eine einfache Lösung gibt:

sed -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/& -> \1\L\2/' file

Oder etwas eleganter (als mein erster Versuch):

sed -r '
h
s/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/
t append
b
: append
H
g
s/\n//' file

Antwort2

Verwenden von GNU sed:

sed -r 's/(.)[^[:upper:]]*(.).*/& -> \1\L\2/' inputfile

Für Ihre Eingabe würde das Ergebnis lauten:

bigBone -> bb
fishMarket -> fm
dogCollar -> dc

Antwort3

fooBarBaz -> fbbUm es auf , abCdEfGh -> aceg, mit GNU zu verallgemeinern sed:

sed -r 's/(.)(.*)/\1\n\2 -> \L\1/;:1
        s/\n([^[:upper:]]*([[:upper:]]))(.*)/\1\n\3\L\2/;t1;s/\n//'

POSIX sedhat kein \L. Daher müssen Sie portabel auf die Verwendung zurückgreifen yund alle Zeichen, die Sie in Kleinbuchstaben umwandeln möchten, manuell eingeben. So etwas wie:

LC_ALL=C sed '/^\([[:alpha:]]\).*/{
h;s//\1/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/\(.\).\(.\)\(.*\)/\2\
\3 -> \1/;:1
/.*\n[^A-Z]*\([A-Z]\).*/{h;s//\1/
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/^\(.\)\n\(.*\)\n\([^A-Z]*[A-Z]\)\(.*\)/\2\3\
\4\1/;t1
}
s/\n//;}'

Antwort4

Diese Antwort ist ähnlich wie die von @devnull.

$ sed 's/\(.\).*\([A-Z]\).*/& -> \1\L\2/g' file
bigBone -> bb
fishMarket -> fm
dogCollar -> dc

verwandte Informationen