2017-12-14 7 views
-1

Ich versuche unter BefehlWie wird ein Codeblock zwischen zwei Mustern durch Leerzeilen ersetzt?

sed '/PATTERN-1/,/PATTERN-2/d' input.pl 

Aber es entfernt

MUSTER-1 die Linien zwischen den Mustern nur mit Versuchte zwischen zwei Mustern mit Leerzeilen einen Code-Block ersetzen: „= head“ PATTERN-2: "= cut"

input.pl enthält folgenden Text

=head 
hello 
hello world 
world 
morning 
gud 
=cut 

Erforderliche Ausgabe:

=head 





=cut 

Kann mir jemand dabei helfen?

+0

'perl -pe '$ f =/^ = kopf /../^= cut /; $ _ = $/wenn $ f> 1 && $ f! ~/E /'' – ikegami

+0

'perl -pe '$ _ = $/wenn $ f && =!/^ = cut /; $ f || =/^ = head/'' – ikegami

Antwort

0
awk '/=cut/{found=0}found{print "";next}/=head/{found=1}1' infile 

# OR 
#^to take care of line starts with regexp 
awk '/^=cut/{found=0}found{print "";next}/^=head/{found=1}1' infile 

Erläuterung:

awk '/=cut/{     # if line contains regexp 
     found=0     # set variable found = 0 
    } 
    found{      # if variable found is nonzero value 
     print "";    # print "" 
     next      # go to next line 
    } 
    /=head/{     # if line contains regexp 
     found=1     # set variable found = 1 
    }1       # 1 at the end does default operation 
           # print current line/row/record 
    ' infile 

Testergebnisse:

$ cat infile 
=head 
hello 
hello world 
world 
morning 
gud 
=cut 

$ awk '/=cut/{found=0}found{print "";next}/=head/{found=1}1' infile 
=head 





=cut 
+1

Hallo Akshay, versuchte deinen Befehl, funktionierte wie erwartet. Können Sie bitte erklären, wie dieser Befehl funktioniert ... bitte – Sanchu

+0

@Sanchu erklärte –

+0

Dank Akshay .. – Sanchu

1
$ awk '/=cut/{f=0} {print (f ? "" : $0)} /=head/{f=1}' file 
=head 





=cut 
1

den gegebenen sed Befehl zu ändern, versuchen

$ sed '/=head/,/=cut/{//! s/.*//}' ip.txt 
=head 





=cut 
  • //! mit anderen als Start-/Endbereichen übereinstimmen, kann von sed Implementierung abhängen, ob es dynamisch die beiden Bereiche oder statisch nur eine von ihnen übereinstimmt. Arbeiten auf GNU sed
    • s/.*// diese Zeilen
0

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

sed '/=head/,/=cut/{//!z}' file 

Zap die Linien zwischen =head und =cut.

Verwandte Themen