こんにちは!
最近寒くなったので夕飯がお鍋になりがちな猫です。
はじめに
抽出や置換を行いたいときに便利なsedコマンドですが、正規表現や変数の使い方でハマってしまうこともしばしば‥‥。
先日も数時間使ってしまったので、備忘録を書きたいと思います。
sedコマンドについて詳しく知りたい方は以下を参照してください。
www.gnu.org
やりたいこと
- file Aの2行目と3行目を抽出し、抽出した文字列でfile Bの2行目と3行目を置換したい
イメージはこんな感じです。
使用したもの
コマンド
# 抽出 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
おわりに
最初は複数行処理をいっぺんに行う方法を探していたのですが、上手くいかなかったため今回はこのような書き方になりました。悔しい‥‥。
もう少しスマートな方法が見つかったらまた記事にしたいと思います。
今回はここまでです!
読んでいただきありがとうございました~!