使用 bash 删除降价中的空白部分

Remove empty sections in markdown with bash

我正在寻找一种方法来删除降价文档中的空白部分,更具体地说,是更改日志。

例如,如果我有:

## Version

### Added
- something

### Removed

### Changed

- something    

### Fixed

我想结束:

## Version

### Added
- something

### Changed

- something    

请注意 Fixed 部分消失了(空到文件末尾)并且 Version 部分仍然存在,因为我应该只对 ### 部分采取行动。

awk解决方法:

awk -v RS="###" 'NF>1{ printf "%s%s",(NR==1? "" : RS),[=10=] }' file
  • RS="###" - 考虑 ### 作为记录分隔符

  • NF>1 - 如果记录包含至少 2 个 字段(包括 部分 名称)

输出:

## Version

### Added
- something

### Changed

- something    

简而言之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 < 
(( p )) && printf "%s" "$w" # if to-print, print buffer

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

### Added
- something

### Changed

- something

如果您对 sectionempty section 的定义与我假设的不完全相同,您可以在阅读行上调整这两个测试。

在普通的 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 [=10=] "\n" } else { print [=10=] }; 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 = [=10=]
    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 [=10=]
    next
}

启动它:

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

### Added
- something

### Changed

- something   

当然,你可以写得更简洁:

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