Text-Processing

使用 coreutils 換行和縮進文本

  • December 6, 2018

簡潔版本

我想創建一個多行文本的表格顯示,類似於以下內容:

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

我嘗試使用awkand 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忽略多行註釋的腳本(有關詳細資訊,請參閱連結)解析的,然後再提供給上面發布的格式化程式碼。

使用 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"
}'

在 fold 命令管道之後,輸出到 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"
很長的一條線
我想折疊
一言以蔽之
邊界和縮進
以及

引用自:https://unix.stackexchange.com/questions/280199