Text-Processing
使用 coreutils 換行和縮進文本
簡潔版本
我想創建一個多行文本的表格顯示,類似於以下內容:
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
andwrap
/的組合來實現這一點,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"
很長的一條線 我想折疊 一言以蔽之 邊界和縮進 以及