2017-02-14 3 views
1


Ich versuche, einen Weg zu finden, um leere Linien zu entfernen, die in meiner asciidoc Datei vor einem Marker-String, wie gefunden werden:durch ein Muster gefolgt leere Zeilen

//Empty line 
[source,shell] 

Ich würde brauchen :

[source,shell] 

ich versuche, mit:

sed '/^\s*$\n[source,shell]/d' file 

aber es ist nicht produzieren nicht die erwarteter Effekt (sogar aus der Klammer entkommen). Irgendeine Hilfe ?

+1

Ist es immer vor '[source, shell]' oder könnte es irgendetwas sein? – Inian

+0

Nein, ich muss andere leere Zeilen erhalten. Löschen Sie einfach leere Zeilen vor den Codeblöcken. Danke –

+0

Ja Zeilen beginnen mit "[source" als es ist ein Marker für asciidoc –

Antwort

1

können Sie verwenden diesen awk-Skript vorherige leere Zeile zu löschen:

awk -v desired_val="[source,shell]" 
'BEGIN { first_time=1 } 
{ 
    if ($0 != desired_val && first_time != 1) { print prev }; 
    prev = $0; 
    first_time = 0; 
} 
END { print $0 }' your_file 

Nächstes Skript als früheres wenig mehr ist, bietet aber alle leeren Zeilen gewünscht, bevor Wert zu löschen.

# AWK script file 
# Provides clearing all empty lines in front of desired value 
# Usage: awk -v DESIRED_VAL="your_value" -f "awk_script_fname" input_fname 

BEGIN { i=0 } 
{ 
    # If line is empty - save counts of empty strings 
    if (length($0) == 0) { i++; } 

    # If line is not empty and is DESIRED_VAL, print it 
    if (length ($0) != 0 && $0 == DESIRED_VAL) 
    { 
    print $0; i=0; 
    } 

    # If line is not empty and not DESIRED_VAL, print all empty str and current 
    if (length ($0) != 0 && $0 != DESIRED_VAL) 
    { 
    for (m=0;m<i;m++) { print ""; } i=0; print $0; 
    } 
} 

# If last lines is empty, print it 
END { for (m=0;m<i;m++) { print ""; } } 

Dies ist awk-Skript durch Typisierung gefolgt Befehl:

awk -v DESIRED_VAL="your_value" -f "awk_script_fname" input_fname

+0

Vielen Dank! das funktioniert! –

+0

Gern geschehen! – Ans

0

Ihre sed Linie, weil sed Prozesse zu einem Zeitpunkt eine Zeile nicht funktioniert, so dass es kein Muster übereinstimmen das schließt \n ein, wenn Sie den Musterbereich nicht manipulieren.

Wenn Sie es noch mit sed zu tun:

sed '/^$/{N;s/\n\(\[source,shell]\)/\1/}' file 

Wie es funktioniert: Wenn eine leere Zeile übereinstimmt, um die nächste Zeile in den Musterraum lesen und die leere Zeile entfernen, wenn ein Marker gefunden wird. Beachten Sie, dass dies nicht korrekt funktioniert, wenn Sie vor der Markierung zwei leere Zeilen haben,, da die erste leere Zeile die zweite Zeile verbraucht und es keine Übereinstimmung mit der Markierung gibt.

Verwandte Themen