BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Linux】【sed】ファイルの特定の複数行を抽出&置換する

こんにちは!
最近寒くなったので夕飯がお鍋になりがちな猫です。

はじめに

抽出や置換を行いたいときに便利なsedコマンドですが、正規表現や変数の使い方でハマってしまうこともしばしば‥‥。
先日も数時間使ってしまったので、備忘録を書きたいと思います。

sedコマンドについて詳しく知りたい方は以下を参照してください。
www.gnu.org

やりたいこと

  • file Aの2行目と3行目を抽出し、抽出した文字列でfile Bの2行目と3行目を置換したい
    イメージはこんな感じです。
    f:id:bftnagoya:20211115111650p:plain:w360
    f:id:bftnagoya:20211115105303p:plain:w360

使用したもの

コマンド

# 抽出
len1=`sed -n 2p ./file_A.txt`;
len2=`sed -n 3p ./file_A.txt`;
# 置換
sed -i -e "2s/.*/$len1/g" -e "3s/.*/$len2/g" ./file_B.txt;

コマンドの説明

以下①~③の処理を2行目と3行目それぞれに対して行っています。

sed -n 2p ./file_A.txt ‥‥①

file Aから2行目の文字列を抽出します。

len1=`sed -n 2p ./file_A.txt` ‥‥②

①の実施結果(抽出した文字列)を変数len1に格納します。

sed -i -e "2s/.*/$len1/g" ./file_B.txt ‥‥③

②の実施結果(文字列が格納された変数)を用いてfile_Bの2行目を置換します。
※変数を使用する際は ' (シングルクォート)ではなく"(ダブルクォート)で囲みます。

実行例

my/path/to/file$ cat -n file_A.txt
     1  aaaaaa
     2  bbbbbbb
     3  ccccc
     4  ddddddd
     5  eeeeee
my/path/to/file$ cat -n file_B.txt
     1  hogehoge
     2  fugafuga
     3  pukapuka
     4  hirahira
     5  meramera
my/path/to/file$ len1=`sed -n 2p ./file_A.txt`;len2=`sed -n 3p ./file_A.txt`;sed -i -e "2s/.*/$len1/g" -e "3s/.*/$len2/g" ./file_B.txt;
my/path/to/file$ cat -n file_A.txt
     1  aaaaaa
     2  bbbbbbb
     3  ccccc
     4  ddddddd
     5  eeeeee
my/path/to/file$ cat -n file_B.txt
     1  hogehoge
     2  bbbbbbb
     3  ccccc
     4  hirahira
     5  meramera

おわりに

最初は複数行処理をいっぺんに行う方法を探していたのですが、上手くいかなかったため今回はこのような書き方になりました。悔しい‥‥。

もう少しスマートな方法が見つかったらまた記事にしたいと思います。

今回はここまでです!
読んでいただきありがとうございました~!