2017-10-13 3 views
-1

Ich suche nach einer Möglichkeit, leere Abschnitte in Abschriften Dokumente, insbesondere changelogs zu entfernen.Leere Abschnitte in Markdown mit Bash entfernen

Zum Beispiel, wenn ich habe:

## Version 

### Added 
- something 

### Removed 

### Changed 

- something  

### Fixed 

Ich mag mit am Ende:

## Version 

### Added 
- something 

### Changed 

- something  

Beachten Sie, dass Fixed Abschnitt ging weg (leer bis zum Ende der Datei) und Version Abschnitt ist immer noch da, wie ich nur auf ### Abschnitte handeln sollte.

+0

Warum downvoting? –

Antwort

1

Im Klar awk:

#!/usr/bin/awk 

BEGIN { 
    inside_empty_section = "false" 
    buffer = "" 
} 

/^$/ { # Add the empty line to the current section buffer or print it 
    if (inside_empty_section == "true") { buffer = buffer $0 "\n" } else { print $0 }; next } 

/^###/ { 
    # This is the beginning of a new section. 
    # Either the previous one was empty: just forget its buffer. 
    # either it was not empty and has already been printed. 
    # In any case, just start buffering a new empty section. 
    inside_empty_section = "true" 
    buffer = $0 
    next 
} 

{ 
    # Found a non-empty line: the current section is NOT empty. 
    # If it was supposed to be empty, print its buffer. 
    if (inside_empty_section == "true") { print buffer } 
    inside_empty_section = "false" 
    print $0 
    next 
} 

starten Sie es mit:

$ awk -f ./test.awk < plop 
## Version 

### Added 
- something 

### Changed 

- something 

Natürlich könnte man es prägnanter machen:

awk '/^$/ {if (i) {b=b $0 "\n"} else {print $0 }; next} \ 
/^###/ {i=1; b=$0; next} {if (i) {print b}; i=0; print $0; next}' < plop 
+0

Alle Lösungen sind wirklich gut, aber ich mag diese am meisten. Ich habe '/^### /' in '/^### /' geändert, um sicherzustellen, dass nur h3 Überschriften berücksichtigt werden. –

1

Awk Lösung:

awk -v RS="###" 'NF>1{ printf "%s%s",(NR==1? "" : RS),$0 }' file 
  • RS="###" - ### als Datensatztrennzeichen

    Berücksichtigung
  • NF>1 - wenn Datensatz mindestens 2 Felder (einschließlich Abschnitt name) enthält

Der Ausgang:

## Version 

### Added 
- something 

### Changed 

- something  
+0

Schön, einfach und elegant. Aber nicht absolut robust gegen '###', die woanders als am Anfang einer Level-3-Section auftreten (zB '#### Sub-Section' oder' -etwas ### ') –

+0

Ich stimme zu: schön, einfach und elegant, funktioniert aber nicht, wenn ein Abschnittsname mehr als ein Wort enthalten kann. – duthen

1

Im Klar bash:

$ cat foo.sh 
#!/usr/bin/env bash 
declare -i p=1 # to-print or not-to-print flag 
declare w="" # buffer 
declare l="" # line 
while read l; do 
    if [[ $l =~ ^###[^#] ]]; then # if new section 
     ((p)) && printf "%s" "$w" # if to-print, print buffer 
     w="$l"$'\n'     # re-initialize buffer 
     p=0       # reset to-print flag 
    else 
     w="$w$l"$'\n'    # update buffer 
     [[ -n $l ]] && p=1  # if non-empty line, set to-print flag 
    fi 
done < $1 
((p)) && printf "%s" "$w" # if to-print, print buffer 

$ ./foo.sh foo.md 
## Version 

### Added 
- something 

### Changed 

- something 

Sie können die beiden Tests auf Leseleitungen anpassen, wenn Ihre Definition von Abschnitt und leeren Abschnitt nicht genau sind was ich angenommen habe.