使用 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
如果您对 section 和 empty 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
我正在寻找一种方法来删除降价文档中的空白部分,更具体地说,是更改日志。
例如,如果我有:
## 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
如果您对 section 和 empty 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