![使用 coreutils 换行和缩进文本](https://linux22.com/image/87725/%E4%BD%BF%E7%94%A8%20coreutils%20%E6%8D%A2%E8%A1%8C%E5%92%8C%E7%BC%A9%E8%BF%9B%E6%96%87%E6%9C%AC.png)
简洁版本
我想创建多行文本的表格显示,类似于以下内容:
all Build all targets
document Create documentation of source files in the subfolders
`src` and `script`, and write it to `man`
test Run unit tests
目前,我对此的输入如下所示,但这当然可以更改:
all---Build all targets
document---Create documentation of source files in the subfolders `src` and `script`, and write it to `man`
test---Run unit tests
我尝试使用awk
and wrap
/的组合来实现此目的pr
,但是虽然换行有效,但缩进却不起作用。这是我目前的方法:
…
| awk -F '---' "{ printf '%-10s %s\n', $1, $2 }" \
| fold -w $(($COLUMNS - 1)) -s
它生成输出
all Build all targets
document Create documentation of source files in the subfolders
`src` and `script`, and write it to `man`
test Run unit tests
…换句话说,第三行没有按预期缩进。
如何设置具有给定换行长度和给定悬挂缩进宽度的文本格式?— 不改变文本的任何其他内容。额外奖励:这应该适用于 UTF-8 和转义/控制字符。
背景信息
目标是创造自记录 Makefile。因此,格式化和显示代码的逻辑应该很小、独立,并且不依赖于单独安装的软件;理想情况下,它应该在任何可以执行 Makefile 的系统上工作,因此我对(接近) coreutils 的限制。
也就是说,我短暂地尝试使用解决问题,groff
但这很快就变得太复杂了(OS Xgroff
和旧版本似乎不支持 UTF-8)。
这原始字符串我正在尝试解析和格式化,因此看起来如下:
## Build all targets
all: test document
## Run unit tests
test:
./run-tests .
## create documentation of source files in the subfolders `src` and `script`,
## and write it to `man`
document:
${MAKE} -C src document
${MAKE} -C script document
目前,这是使用sed
忽略多行注释的脚本(有关详细信息,请参阅链接)进行解析的,然后再将其提供给上面发布的格式化代码。
答案1
在折叠命令之后,将输出通过管道传输到 sed 并用制表符替换行首。您可以使用之前的“tabs”命令来控制缩进:
tabs 5
echo "A very long line that I want to fold on the word boundary and indent as well" | fold -s -w 20 | sed -e "s|^|\t|g"
一条很长的线 我想折叠的 关于这个词 边界和缩进 还有
答案2
使用 gnu awk 你可以做一些简单的事情,如下所示:
awk -F '---' '
{ gsub(/.{50,60} /,"&\n ",$2)
printf "%-10s %s\n", $1, $2 }'
对于处理长单词的更准确的冗长版本:
awk -F '---' '
{ printf "%-10s ", $1
n = split($2,x," ")
len = 11
for(i=1;i<=n;i++){
if(len+length(x[i])>=80){printf "\n "; len = 11}
printf "%s ",x[i]
len += 1+length(x[i])
}
printf "\n"
}'
答案3
这是一个更简短的答案,它使用折叠然后将其输出移动 11 个空格。要查看它在做什么,请在最后的 bash 中添加-v
或。-x
| sed 's:\(.*\)---\(.*\):printf "%-10s " "\1";fold -w '$(($COLUMNS - 11))' -s <<\\!|sed "1!s/^/ /"\n\2\n!\n:' | bash