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 -> fbb
Um 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 sed
hat kein \L
. Daher müssen Sie portabel auf die Verwendung zurückgreifen y
und 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