Bash でテキストファイルを結合する際に空行などを間に挿入する その2
以前こんな記事を書いた。
$ cat file-1.md file-2.md
という風に単純連結すると、ファイルとファイルの間が詰まってしまって分かりにくいので、空行や区切り文字を入れたい、という話だった。
この時は $ cat file-1.md <(echo -e '\n-----\n') file-2.md
こんな書き方を紹介したが、2つのファイル名を明示しないといけないのがメンドイ。
今回は、$ cat ./*.md
という風に、ワイルドカードで2つ以上のファイルをまとめて結合する際に区切り行を入れる方法を調べた。
やり方 1 : awk
を使う
# ファイルとファイルの間に空行と罫線を入れて連結出力する
$ awk 'FNR==1{print "\n\n----------\n\n" }1' ./*.md
FNR
という awk
の組み込み変数を使っている。このやり方をした場合、1ファイル目の上にも空行・罫線が入ってしまうので、連結後に行頭の空行と罫線を調整すると良いだろう。
- 参考 : awk Tutorial => FNR - Number of Records in File
FNR
の他にもNR
やNF
といった組み込み変数がある。FNR
は「Number of Records in File」の略で、処理中のファイル行数を取得できる
やりかた 2 : sed
を使う
# ファイルとファイルの間に空行と罫線を入れて連結出力する
$ sed -e '$s/$/\n\n\n----------\n\n/' -s ./*.md
今度は sed
の -e
(--expression
) と -s
(--separate
) を使う。特に -s
オプションを使うことで、複数のファイルを個別に扱えるので、「ファイル末尾に空行や罫線を入れる」という正規表現をファイルごとに行えるワケだ。つまりこのやり方だと、awk
とは違って最後のファイルの末尾にも空行と罫線が入ってしまうので、結合後にファイル末尾の空行や罫線を調整すると良いだろう。
他にも for in
ループで処理するやり方などもあったが、awk
や sed
でとりあえず空行を入れて連結したのをファイルに書き出し、微調整するので良いかなーと思う。