Newlines
如何列印行號但在空行重置行計數器?
我有一個 file.txt 包含:
this is the first second line not last line fourth but first second in list seventh in file seventh with nl
通常我會像這樣通過
cat
管道|
輸入nl
:$> cat file.txt | nl 1 this is the first 2 second line 3 not last line 4 fourth but first 5 second in list 6 seventh in file 7 seventh with nl
但是當遇到這樣的空行時,我需要重置行號:
$> alias_or_function file.txt 1 this is the first 2 second line 3 not last line 1 fourth but first 2 second in list 3 seventh in file 4 seventh with nl
我怎麼能在我的 中使用快速函式或別名來做到這一點
~/.zshrc
?
您可以將空白行替換
\:\:
為nl
新頁面正文的開始:<your-file sed 's/^[[:space:]]*$/\\:\\:/' | nl
所以作為一個函式:
number-lines-of-paragraphs() { sed -e 's/^[[:space:]]*$/\\:\\:/' -- "$@" | nl }
(請注意,如果它們也出現在輸入中,
nl
將理解為頁眉/正文/頁腳分隔符,這就是為什麼您通常不能使用將行號添加到任意文本的原因)。\:``\:\:``\:\:\:``nl
您還可以獲得相同的輸出格式,而無需使用以下警告
awk
:awk 'NF {printf "%6u\t%s\n", FNR, $0; next}; {FNR = 0; print}'
或者其他人在這裡發布的一些變體。
上面,數字被填充為 6 個字元,後跟一個 TAB 字元,如預設
nl
輸出格式(%6u\t%s\n
相當於nl
’s default-s $'\t' -n rn -w 6
),但您當然可以根據自己的喜好調整該格式。但是現在,要使其成為一個將任意文件名作為參數的函式,這就是您遇到
awk
自己的警告的地方,即它會阻塞包含=
字元的文件名,因為這些字元被解釋為 awk 變數賦值(至少如果第一個左邊=
看起來像一個有效的 awk 變數名)。可以通過以下方式解決gawk
:number-lines-of-paragraphs() { gawk -e ' NF {printf "%6u\t%s\n", FNR, $0; next} {FNR = 0; print}' -E /dev/null "$@" }
請注意,如果該函式傳遞了多個文件,則行號將在每個文件的開頭重置。如果您希望將所有文件的內容作為單個流作為一個整體進行編號,就像
sed | nl
方法中一樣,請替換FNR
為NR
上面的內容。在任何情況下,
sed
和gawk
都將理解-
為表示標準輸入,而不是-
目前目錄中呼叫的文件(用於./-
解決它)。