2015-05-07 26 views
6

ich den folgenden Inhalt haben:sed - Einsatzleitung nach X Linien nach Spiel

void function_1() 
{ 
    //something (taking only 1 line) 
} 
->INSERT LINE HERE<- 
//more code 

Mit sed, möchte ich Zeile an der INSERT LINE einfügen HIER Label. Der einfachste Weg, sollte sein:

  1. find text "function_1"
  2. 3 Zeilen überspringen
  3. Einsatz neue Linie

Aber keines der bekannten sed Optionen die Arbeit machen.

sed '/function_1/,3a new_text 

Einsätze neuer_text ersetzt direkt nach 'function_1'

sed '/function_1/,+3a new_text 

Einsätze Neuer_Text nach jedem der nächsten drei Zeilen nach 'function_1'

sed '/function_1/N;N;N; a new_text 

Einsätze neuer_text ersetzt an mehreren Stellen, nicht verwandten zum Muster

Danke.

Antwort

4

Try this:

sed "/function_1/{N;N;N;a new_text 
}" filename 
+1

Alternativ: 'sed '/ function_1 /! {P; d;}; n; n; n; ein neuer Text'' Es ist mehr umständlich, funktioniert aber ohne Zeilenumbruch im sed-Code (weil der Befehl' a' ist Am Ende). – Wintermute

+0

Ich denke, dass dieser Ansatz nicht auf allen Versionen von sed funktioniert, da POSIX angibt, dass Sie 'a \' gefolgt von einem Newline verwenden sollten, um Text anzuhängen. –

2
sed '/function_1(/,/^[[:space:]]*}/ { 
,/^[[:space:]]*}/ a\ 
Line that\ 
you want to\ 
insert (append) here 
    }' YourFile 
  • die Zeile einzufügen nach den } (allein in der Zeile mit dem schließlich etwas Platz vor) aus dem Abschnitt mit function_1(
  • Start Ich gehe davon gibt es keine } allein in Ihrem internen Code wie in Ihrer Probe

sein carreful auf Auswahl auf Funktionsnamen basiert, weil es (und normalerweise ist es) als ein Aufruf der Funktion selbst in anderem Codeabschnitt so vielleicht ein /^void function_1()$/ besser ist

1

Verwendung awk verwendet werden könnte:

awk '1;/function_1/{c=4}c&&!--c{print "new text"}' file 
  • 1 ist eine Abkürzung für {print}, so dass alle Zeilen in der Datei gedruckt
  • , wenn das Muster, wenn
  • c-4 gesetzt abgestimmt ist c 1 erreicht (so c wahr ist und !--c wahr ist),

die Linie legen Sie nur !--c verwenden könnte, aber das Hinzufügen die Prüfung für c wahr, wie gut zu sein, bedeutet, dass c nicht über 0 abnimmt nicht halten.

0

Zählen Sie nicht, match:

sed -e '/^void function_1()/,/^}$/ { /^}$/a\ 
TEXT TO INSERT 
}' input 

Diese im Block zwischen der Deklaration und der schließenden Klammer, und dann hängen Sie TEXT_TO_INSERT nach der schließenden Klammer aussieht.

Verwandte Themen