豆腐とコンソメ

豆腐とコンソメ

もろもろのプログラム勉強記録

sedで正規表現で置換したときのメモ

正規表現系のメタ文字の意味とかって、検索しにくいよね。

やりたいこと

たまに、こんな感じのHTMLがあって、

もととなるHTML

<option value="">都道府県を選択</option>
<option value="北海道" >北海道</option>
<option value="青森県" >青森県</option>
<option value="岩手県" >岩手県</option>
<option value="宮城県" >宮城県</option>


Vue.jsかなんかを使うことになり、なんやかんやでHTMLのoptionsをslotで利用するのではなく、オブジェクトの形として持たせたいときがある。

ほしい形

{
  value:'',
  title:'都道府県を選択' 
}, 
{
  value:'北海道',
  title:'北海道' 
}, 
{
  value:'青森県',
  title:'青森県' 
}, 
{
  value:'岩手県',
  title:'岩手県' 
}, 
{
  value:'宮城県',
  title:'宮城県' 
}, 


5個ぐらい置き換えたところで、なんだかなぁということで、置き換える方法を学ぶことにした。結果手作業よりも時間がかかった。
次から生かせるよ、うん。


作業記録

てきとうなエディタを開いて、もととなるHTMLを放り込む。 textというファイル名をつけて保存する。

textというファイルで保存

<option value="">都道府県を選択</option>
<option value="北海道" >北海道</option>
<option value="青森県" >青森県</option>
<option value="岩手県" >岩手県</option>
<option value="宮城県" >宮城県</option>

「北海道」という都道県名のみ正規表現で抽出する。

正規表現で抽出

$ grep -E -o  '>(.*)<' test
>都道府県を選択<
>北海道<
>青森県<
>岩手県<
>宮城県<


`-Eオプションはgrepで拡張正規表現を使うっていうもの。grepはgrepで正規表現の方言があるみたいなので、込み入ったことをするときは注意が必要そう。
-oオプションは、マッチした箇所のみ抽出する。このオプションがないとマッチした部分が含まれる行がすべてが出力される。

正規表現そのものの意味は、>で始まり、<で終わる間の文字を取得したいという願いを込めたもの。
括弧でくくった箇所だけほしかったんだけれども、grepの正規表現って指定した箇所のみ抽出ってできないのかしら。

とりあえず先ほどの結果をtest2に保存しとく。

とりあえず保存

$ grep -E -o  '>(.*)<' test > test2


調べると、sedコマンドは正規表現で該当箇所のみ抽出ができるみたい。

こんな感じの基本があって、

sedの基本構文

$  sed  "s/置き換え前/置き換え後 /"


-rオプションで正規表現が使えて、正規表現で括弧で指定した箇所は、\1で参照できるとのこと。
括弧が複数あれば、''\1,'\2'と対応してく。

つかってみる

$  cat test2 | sed -r s"/>(.*)</\1/"
都道府県を選択
北海道
青森県
岩手県
宮城県


お、いい感じに参照出来ました。

あとは、ほしい形に整形するだけで終わり。

無事完了

$ grep -E -o  '>.*<' test |sed -r s"/>(.*)</{ value: \1, title: \1, },/"
{ value: 都道府県を選択, title: 都道府県を選択, },
{ value: 北海道, title: 北海道, },
{ value: 青森県, title: 青森県, },
{ value: 岩手県, title: 岩手県, },
{ value: 宮城県, title: 宮城県, },

改行したければしたい箇所で\nをいれる。