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ファイル目の上にも空行・罫線が入ってしまうので、連結後に行頭の空行と罫線を調整すると良いだろう。

やりかた 2 : sed を使う

# ファイルとファイルの間に空行と罫線を入れて連結出力する
$ sed -e '$s/$/\n\n\n----------\n\n/' -s ./*.md

今度は sed-e (--expression) と -s (--separate) を使う。特に -s オプションを使うことで、複数のファイルを個別に扱えるので、「ファイル末尾に空行や罫線を入れる」という正規表現をファイルごとに行えるワケだ。つまりこのやり方だと、awk とは違って最後のファイルの末尾にも空行と罫線が入ってしまうので、結合後にファイル末尾の空行や罫線を調整すると良いだろう。

他にも for in ループで処理するやり方などもあったが、awksed でとりあえず空行を入れて連結したのをファイルに書き出し、微調整するので良いかなーと思う。