GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Lum – Wie kann die Sed-Ausgabe wie der formatierte Druck von Printf formatiert werden?

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

Linux
  1. So speichern Sie die Befehlsausgabe in einer Datei unter Linux

  2. Wie erstelle ich einen virtuellen Ausgang in Pulsaudio?

  3. Wie ersetzt man sed wie Text durch Python?

  4. tcpdump:Wie bekomme ich eine grepable Ausgabe?

  5. So sortieren Sie diese Ausgabe 1,10,11..2

So ersetzen Sie eine Festplatte unter Linux

So klonen Sie eine Partition oder Festplatte unter Linux

BENUTZUNG DES SED-EDITORS

Unix Sed Tutorial:So schreiben Sie mit Sed in eine Datei

So grep ps-Ausgabe mit Headern

Wie stoppe ich die Ping-Ausgabe?