2017-12-20 11 views
0

Zum Beispiel verwenden, ich habe eine Datei test_sed genannt, es Inhalt ist, ist wie folgt:Wie zum Einfügen von Text „sed -e“

abc 
def 
ghi 
jkl 

Ich mag Inhalt einzufügen, zum Beispiel „Hallo Welt“, wenn Es gibt drei aufeinanderfolgende Zeilen wie abc\ndef\nghi. Also benutze ich sed -f test.sed test_sed. Das Skript test.sed wie unten geschrieben:

:begin 
/abc/,/ghi/ { 
    /ghi/! { 
    $! { 
     N; 
     b begin 
    } 
    } 
    /abc.*ghi/a hello world 
} 

Und es funktioniert. Aber wenn ich es so in der Befehlszeile schreibe:

Es funktioniert nicht und ich weiß nicht, wie man es korrigiert.

+0

Ich verstehe die Frage nicht wirklich. Möchten Sie nur Text in die dritte Zeile einfügen? Wenn das der Fall ist, können Sie Folgendes tun: 'sed -n 'p; 3a" Hallo Welt "' yourfile' – NullDev

+0

@NullDev Ich denke, OP möchte drei aufeinanderfolgende Zeilen übereinstimmen – Sundeep

+0

Ja, @Sundeep ist richtig – Lianshuai

Antwort

0

sollten Sie einfache Anführungszeichen verwenden bash zu verhindern, dass die Erweiterung der Ausrufezeichen (!):

sed -e ':begin; /abc/,/ghi/ { /ghi/! { $! { N; b begin }; }; /abc.*ghi/a hello world };' test_sed 
    ^                   ^

Es scheint, wie Sie einen Zeilenumbruch einfügen müssen zwingen sed Anschlag Einfügen lassen, das ist für mich gearbeitet:

$ sed -e ':begin; /abc/,/ghi/ { /ghi/! { $! { N; b begin }; }; /abc.*ghi/a hello world 
};' test_sed 
+0

Ich habe es versucht. Aber es ist immer noch falsch. – Lianshuai

+0

@Lianshuai Probieren Sie den neuen Code aus. – iBug

+0

es funktioniert. Ist der Grund wie das, was du gesagt hast? – Lianshuai

0

Wenn Sie perl haben, dann ist es viel einfacher, mit slurp Modus:

perl -0777 -pe 's~abc\Rdef\Rghi\R~$&hello world\n~' file 

abc 
def 
ghi 
hello world 
jkl 

Alternativ können Sie awk verwenden:

awk '$1=="abc"{s=$1; for (i=1; i<=2; i++) { 
    getline; s = s RS $1 } if (s=="abc\ndef\nghi") $0 = s RS "hello world"} 1' file 

abc 
def 
ghi 
hello world 
jkl 
0

sed pingelig ist. Insbesondere scheinen Sie eine Version zu verwenden, die den a Befehl nicht durch eine neue Zeile unmittelbar gefolgt ermöglicht, so dass, obwohl die folgenden Arbeiten in BSD, kann es nicht auf Gnu-sed: vielleicht

$ sed -e ':begin 
/abc/,/ghi/ { /ghi/! { $! { N; b begin 
}; }; /abc.*ghi/a\ 
hello world 
};' input 
0

Diese Arbeit Sie (GNU sed):

sed '/abc/!b;n;/def/!b;n;/ghi/a\hello world' file 

Wenn die erste Zeile abc enthält, enthält die zweite Zeile def und die dritte Zeile enthält ghi dann hello world anhängen.

Eine robustere Lösung:

sed ':a;N;s/\n/&/2;Ta;/abc.*\n.*def.*\n.*ghi/!P;//!D;a\hello world' file 

Dies ermöglicht Ausfälle erneut versucht zu werden.

Verwandte Themen