Shell Script-Ausgabeeinzug

2

Ich möchte ein Shell-Skript / eine Anwendung in einem anderen Skript aufrufen. Jede Zeile des enthaltenen Skripts sollte um 2 Leerzeichen eingerückt werden. Ist das möglich?

Die Ausgabe sollte ungefähr so ​​aussehen.

I'm the main-scripts' output.
  I'm a second script, called inside the main-script.
  Every line of my output is indented by 2 spaces.
  This is not implemented inside of me, but in the main-script
  as I should also be called outside of the main-script and then
  my output shouldn't be indented.
Thats all from the second script.

Ist das möglich und wie?

lschuermann
quelle

Antworten:

2

Sie können sedoder verwenden awk, um dies zu tun. Zum Beispiel können Sie in Ihrem Hauptskript Folgendes tun:

# execute the command and pipe to sed
second-script | sed 's/\(.*\)/  \1/'

Mit dem obigen sedBefehl werden jeder Ausgabezeile von einfach zwei Leerzeichen vorangestellt second-script.

Gogatoren
quelle
2

Wie immer in Unix gibt es Optionen.

paste

Verwenden Sie das pasteDienstprogramm mit einer leeren LHS-Datei, zum Beispiel:

cat ~/.bashrc | paste /dev/null -

Der catBefehl ist ein Platzhalter für Ihr zweites Skript.

Der pasteBefehl soll zwei Dateien nehmen und zusammenfügen, zB:

$ paste file1 file2
file 1 line 1    <TAB>  file 2 line 1
file 1 line two  <TAB>  file 2 line 2
file 1 line 3    <TAB>  file 2 line iii

Die Art und Weise, wie ich es oben benutze, ist, /dev/nullwie file1und STDINwie von file2angegeben zu verwenden -. Bei Verwendung als Eingabe werden /dev/nullNULL-Zeichen zurückgegeben. Dies bedeutet, dass vor jeder Zeile von file2, der Ausgabe Ihres zweiten Skripts, NULL gefolgt von einem TAB-Zeichen steht.

Sie können noch weiter gehen: pasteHat eine --delimiterOption, aber die Angabe von zwei Leerzeichen führt nicht zu dem erwarteten Effekt: Trennzeichen 1 wird zwischen der ersten und der zweiten Spalte verwendet, Trennzeichen 2 wird zwischen der zweiten und der dritten Spalte verwendet und so weiter.

paste|expand

Um einen Einzug mit zwei Leerzeichen zu erhalten, würden Sie die pastedurchgestrichene Ebene erneut verwenden expand -2: Dadurch werden alle Tabulatoren in zwei Leerzeichen umgewandelt:

cat ~/.bashrc | paste /dev/null - | expand -2

Dies verhält sich genau so, wie Sie es angegeben haben.

sed oder awk

Ein weiterer Ansatz ist die Verwendung von sedoder awk:

cat ~/.bashrc | sed 's/^/  /'

Dadurch wird nach dem Zeilenanfang (" ^") gesucht und ein Leerzeichenpaar ersetzt oder wirklich eingefügt.

cat ~/.bashrc | awk '{printf "  %s\n",$0}'

Dies nimmt jede vollständige Zeile (" $0") und formatiert sie mit printfdem Formatbezeichner von zwei Leerzeichen, gefolgt von der zu druckenden Zeichenfolge, gefolgt von einer neuen Zeile.


Denken Sie daran, dass alle oben genannten Befehle den catTeil der Pipeline eliminieren können , dh paste /dev/null ~/.bashrcoder paste /dev/null ~/.bashrc|expand -2, gleich sed 's/^/ /' ~/.bashrcoder awk '{printf " %s\n",$0}' ~/.bashrc. Es wird oft als Anfängerfehler gewertet, wenn es catzuerst in einer Pipeline verwendet wird.

Reich
quelle
1
+1 für eine sauberere Nutzung von sed
Jim L.
@JimL. Ich habe erkannt, ich bin die große Sünde begangen , cat ... | <command>wo paste, sedund awkalle nehmen einen Dateinamen als Argument. Kopf hängt in Schande Zu meiner Verteidigung die Antwort auf "Was habe ich gedacht?" zu sein scheint Klarheit , so dass der Dateiname immer an der gleichen Stelle ist je nachdem , was Alternative verwendet wird.
Rich