Die expr
scheinen nicht zu einem nützlichen Zweck hier zu dienen, und wenn es so wäre, ein sed
Befehl wäre sicherlich keine gültig oder nützliche Sache, um unter den meisten Umständen daran zu gehen. Sie sollten es wahrscheinlich einfach rausnehmen.
Die folgende Schleife ist jedoch ebenfalls problematisch. Unquoted variables in shell script are very frequently an error. In diesem Fall können Sie das, was Sie übergeben, nicht an die for
-Schleife übergeben (das würde dazu führen, dass die Schleife nur einmal ausgeführt wird, wobei die Schleifenvariable auf die Zeichenfolge in Anführungszeichen gesetzt ist), aber Sie können nicht verhindern, dass die Shell die Platzhaltererweiterung ausführt die nicht in Anführungszeichen gesetzte Zeichenfolge. Wenn also die Zeichenfolge *
enthält, erweitert die Shell diese beispielsweise auf eine Liste von Dateien im aktuellen Verzeichnis.
Glücklicherweise kann dies alles in einem nur etwas komplizierteren sed
Skript getan werden.
Das heißt, wenn die Zeilennummer nicht 100 ist, löschen Sie diese Zeile und beginnen Sie mit der nächsten Zeile. Ansonsten sind wir in Zeile 100; Ersetze Leerstellen durch Zeilenumbrüche (print) und beende das Programm.
(Der Backslash Escape-Codes \t
und \n
sind nicht universell tragbar;.. Und \+
für die Wiederholung ist auch eine optionale Erweiterung Ich glaube, es gibt auch sed
Varianten, die Semikolon als Befehlsseparator Wenigsten Wenden Sie sich sed
Manpage, experiment, ., und wenn alles anderes fehlschlägt, vielleicht wechseln awk oder Perl Nur für den Fall, hier ist eine Version, die auch auf Mac OSX funktioniert:
sed '100!d
s/[ ][ ]*/\
/g;q' log.txt
Das Zeug in den eckigen Klammern ist ein Raum und ein wörtliches Register; in Bash, mit Standard-Tastaturbelegungen, geben Sie ctrl-V ein, um eine wörtliche Registerkarte zu erstellen.)
Übrigens wird dies auch die Variable Capture Antipattern los. Es gibt gute Gründe, die Ausgabe auf eine Variable zu beschränken, aber wenn dies vermieden werden kann, erhält man oft ein einfacheres, robusteres und effizienteres sowie idiomatischeres und eleganteres Skript. (Ich sehe keinen Grund, den Protokolldateinamen in diesem Fall auch in eine Variable zu schreiben; aber in einem größeren Skript könnte es Sinn machen.)
In Ihrem vorherigen sed-Befehl funktionierte es mit Zahl, weil 'expr 'kann eine Zahl als Ausdruck für ein Argument nehmen. – SLePort