2017-10-13 152 views
-1

我正在尋找一種方法來刪除markdown文檔中的空白部分,更具體地說,更新日誌。用bash刪除空白部分

舉例來說,如果我有:

## Version 

### Added 
- something 

### Removed 

### Changed 

- something  

### Fixed 

我想直到結束:

## Version 

### Added 
- something 

### Changed 

- something  

注意Fixed節走了(空,直到文件的結尾)和Version節仍然存在,因爲我只應在###部分採取行動。

+0

爲什麼downvoting? –

回答

1

在平原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 
} 

與啓動它:

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

### Added 
- something 

### Changed 

- something 

當然,你可以把它更簡潔:

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

所有解決方案都非常好,但我最喜歡這個。我將'/^### /'修改爲'/^### /',以確保只考慮h3標題。 –

1

awk中溶液:

awk -v RS="###" 'NF>1{ printf "%s%s",(NR==1? "" : RS),$0 }' file 
  • RS="###" - 考慮###如記錄分隔符

  • NF>1 - 如果記錄包含至少2個字段(包括名)

輸出:

## Version 

### Added 
- something 

### Changed 

- something  
+0

不錯,簡單而優雅。但是,對於出現在其他地方而不是-3級開始部分的###,絕對不是很健壯(例如'####小節或' - 某些###') –

+0

我同意:好,簡單和優雅,但如果一個部分名稱可能包含多個單詞,則不起作用。 – duthen

1

在普通的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 

你可以,如果你的部分空部分的定義是不完全的讀線的兩個測試適應我所假設的。