2016-07-19 20 views
1

Ich möchte einen Block des Codes in einer Datei mit sed oder awk auskommentieren.Kommentieren Sie einen Block eine Datei mit sed oder awk

Ex. Eingabe

this is source file; 
line one code; 
line two code; 
line three code; 
line four code; 
line 5 code; 
if something then 
    line 6 code; 
end if; 

In diesem möchte ich aus Zeile zwei des Codes kommentieren, um zu beenden, wenn.

D.h. der Ausgang

sollte
this is source file; 
line one code; 
/* 
line two code; 
line three code; 
line four code; 
line 5 code; 
if something then 
    line 6 code; 
end if; 
*/ 

versucht, diese

awk '"/line two code;/{e=0}/end if;/" {printf("%s%s%s\n", "/*", $0, "*/"); next} {print}' 

Aber es anhängt/* und */zwischen jeder Codezeile.

+2

Lernen Sie Ihre 'awk' Code in Schritten zu debuggen. Ich glaube nicht, dass "/ line two code;/{e = 0}/end if; /" 'tut, was Sie denken/brauchen. Gute Lösung unten. Viel Glück für jeden. – shellter

+1

Holen Sie sich das Buch Effective Awk Programming, 4. Auflage, von Arnold Robbins und lesen Sie die ersten paar Seiten, dann besuchen Sie Ihren Code. –

Antwort

3

Ich möchte von line two code auszukommen zu end if:

Sie awk wie diese verwenden:

awk '/line two code;/{print "/*"; p++} 1; p && /end if;/{print "*/"; p=0}' file 

this is source file; 
line one code; 
/* 
line two code; 
line three code; 
line four code; 
line 5 code; 
if something then 
    line 6 code; 
end if; 
*/ 
+0

@Arun: Hat das für Sie funktioniert? – anubhava

+0

Ehrfürchtig. Funktioniert perfekt für den gegebenen Anwendungsfall. Aber, wenn ich zwei if-Anweisungen habe, fügt es Ende-Kommentar (* /) für das zweite Ende wenn auch hinzu. –

+0

Es funktioniert gut für das gegebene Szenario.Aber Zum Beispiel: es funktioniert nicht für diese Quelle Dies ist Quelldatei; Zeile eins Code; Zeile zwei Code; Zeile drei Code; Zeile vier Code; Zeile 5 Code; wenn etwas dann Zeile 6 Code; Ende wenn; wenn something_else dann Zeile 7 Code; Ende wenn; –

2

Eine Lösung sed funktioniert so ziemlich die gleiche Art und Weise mit:

sed '/line two code;/s|$|\n/*|; /end if;/s|$|\n*/|' file 
1

Arunkumar Ramamoorthy, ich denke, der folgende Code kann helfen:

awk '/line two code;/{print "/*"}{print $0}/end if;/{print "*/"}' input 

Zumindest Es funktioniert auf meinem Mac

➜ ShellBean cat input 
this is source file; 
line one code; 
line two code; 
line three code; 
line four code; 
line 5 code; 
if something then 
    line 6 code; 
end if; 
➜ ShellBean awk '/line two code;/{print "/*"}{print $0}/end if;/{print "*/"}' input 
this is source file; 
line one code; 
/* 
line two code; 
line three code; 
line four code; 
line 5 code; 
if something then 
    line 6 code; 
end if; 
*/ 
1

Dies könnte für Sie (GNU sed) arbeiten:

sed $'/line two code/{:a;N;/end if/!ba;i/*\n;a*/\n}' file 

Dadurch werden die Zeilen zwischen den beiden Literalen in den Musterbereich eingefügt und dann die erforderlichen Zeilen eingefügt und angehängt, wenn sie gedruckt werden.

N.B. die $'... ist bashism, dass die Einzeiler schließen Zeilenumbrüche erlaubt, aber wenn Sie mehrere Befehle vorziehen arbeiten:

sed -e '/line two code/{:a;N;/end if/!ba;i/*' -e 'a*/' -e '}' file 
Verwandte Themen