Kann sed Text durch eine Zeichenfolge ersetzen, die wie der formatierte Druck von printf formatiert ist?
Der folgende sed-Befehl ersetzt eine Zeile, die mit dem aktuellen Wert von „$domain“ beginnt, durch mehrere in Variablen angegebene Werte.
/bin/sed "s/\(^${domain} *${limittype} * ${limititem}.*\)/$EXPL#\1\n${domain} ${limittype} ${limititem} ${value}/" /etc/security/limits.conf
Die Ausgabe wird jedoch nicht korrekt ausgerichtet, da die Länge der Werte von domain etc. nicht gleich sind.
Die Ausgabe wäre also so etwas wie
#oracle hard nproc 131072
oracle hard nproc 666
Es ist zwar gültig, aber schwer zu lesen. Ich würde lieber so etwas wie
bekommen#oracle hard nproc 131072
oracle hard nproc 666
Das Beste, was ich mitbringen kann, um die gewünschte Ausgabe zu erhalten, ist:
/bin/sed "s/\(^${domain}\)\( *\)\(${limittype}\)\( *\)\(${limititem}\)\( *\)\(.*\)/$EXPL#\1\2\3\4\5\6\7\n${domain}\2${limittype}\4${limititem}\6${value}/" /etc/security/limits.conf
Aber ich glaube, es muss einen eleganteren Weg geben, dies zu tun.
Das Dokument sed one liners enthält einige Beispiele, die eine bestimmte Anzahl von Zeichen verwenden, z. B.
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # set at 78 plus 1 space
Aber das steht im regexp
Abschnitt nicht im replacement
Abschnitt.
Akzeptierte Antwort:
Dies verwendet die erweiterte Regex-Syntax -r
, wodurch viel Unordnung beseitigt wird. Da Sie einige der Feldwerte bereits kennen, müssen Sie sie auch nicht zurückverweisen, was wiederum Unordnung (und Overhead) reduziert.
&
ist ein besonderer Wiederbeschaffungswert:Es enthält das gesamte passende Muster. Mit &
, reduziert wiederum Unordnung. Da es sich nicht um eine Rückreferenz handelt, hat es deutlich weniger Overhead.
Ich habe ( +)
verwendet vs. ( *)
. Das +
geht davon aus, dass zwischen Eingabefeldern mindestens ein Leerzeichen steht. Ändern Sie ihn einfach in *
es ist nicht der Fall.
EXPL=
dom=oracle
typ=hard
itm=nproc
val=666
echo "oracle hard nproc 131072" |
sed -r "s/^$dom( +)$typ( +)$itm( +).*/$EXPL#&\n$dom\1$typ\2$itm\3$val/"
Ausgabe
#oracle hard nproc 131072
oracle hard nproc 666