以下を含む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
Express関数またはエイリアスを使用してこれをどのように実行できますか~/.zshrc
?
ベストアンサー1
空白行を\:\:
新しい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
出力形式(defaultと%6u\t%s\n
同じ)と同じですが、もちろんこの形式を必要に応じて調整できます。nl
-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
なくstdinとして理解されます。-
-
./-