テキストをちょっと加工するには「sed」が便利。 sedの使い方を簡単にまとめておきました。 Windowsで使いたいならば、 dos用のsedがvectorに ありました。
たとえば nantoka.sed というスクリプトファイルで inputfile.txt というファイルをいじりたいなら、 次のようなコマンドを実行する。
sed -f nantoka.sed inputfile.txt
ちょっと使うだけならスクリプトファイルを使わずにコマンドラインに書く。
sed '命令' inputfile.txtただし、コマンドラインに書くときは '命令' の後に p(表示せよ) と d(新たに次の行を読み込め) が省略されていると解釈されます(下の例参照)。
# ファイル名は chiken.sed s/dog/cat/g p dというファイルを作って、以下のコマンドを実行する。
sed -f chikan.sed inputfile.txt
sed 's/dog/cat/g' inputfile.txt
# コメント 「実行条件1」「命令1」 「実行条件2」{ 「命令2.1」 「命令2.2」 } …… d
5,10p d
同じことをスクリプトファイルを使わずに実行する場合は、 -n オプションをつけて 自動的に p が付加されることをやめさせます。
sed -n '5,10p' inputfile.txt
$p d
スクリプトファイルを使わずに実行する場合は、上と同様に -n オプションをつける必要があります。
sed -n '$p' inputfile.txt
sed '/^#/d' inputfile.txt
: 「ループの名前」 命令 b 「ループの名前」
使い方は例aaaからbbbに囲まれた部分を抽出する、削除するを参照。
s/Mr\. \([A-Za-z]*\)/\1-san/g p d
<div class="article">という文字列から </div>という文字列に囲まれた部分のみを抜き出して表示する。
/<div class="article">/{ :loop N /<\/div>/!b loop # </div>を含まない行ならば:loopに戻る(b) # ここでは<div class="article">を含む行から</div>を含む行までを記憶(N)している s/^.*\(<div class="article">.*<\/div>\).*$/\1/ # 囲まれた部分以外を記憶から削除 p } d # 囲まれた部分以外は表示(p)しない
逆に、上記の部分のみを削除するには次のスクリプトファイルを使えばよい。
/<div class="article">/{ :loop N /<\/div>/!b loop # ここまでは上と同じ s/<div class="article">.*<\/div>// # 囲まれた部分を記憶から削除 } p d
A is B. B is C. C is D.
E is F. G is H.
という文章を
A is B.
B is C.
C is D.
E is F.
G is H.
にする。
# ピリオドごとに改行を追加して、だらだらと長い文章を整形する。 s/\. */.\ /g p d
すべての行を読み込んでから改行を消すことで、改行を削除できる。
:loop N $!b loop s/\n//g
同じことをコマンドラインでするには、セミコロン(;)で各行をつなげればよい。
sed ':loop; N; $!b loop; s/\n//g' inputfile.txt
たとえば2012年3月31日に作った資料を 20120331_memo.txtなどという名前で保存していましたが、 ある日、2012-03-31_memo.txtのほうが圧倒的に見やすく思えてきました。
というわけで、これまで作ったYYYYMMDD○○という形式のファイルやディレクトリの名前を、 YYYY-MM-DD○○に変更するための sedスクリプトを作りました。 西暦を2桁で表していた場合にも対応しています。
/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/{ # YYYYMMDD○○を変換 s/^\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9].*$\)/mv \1\2\3 \1-\2-\3/ p } /^[0-9][0-9][0-9][0-9][0-9][0-9][^0-9]/{ # YYMMDD○○を変換 s/^\([0-9][0-9][0-9][0-9]\)\([0-9][0-9].*$\)/mv \1\2 \1-\2/ p } dUNIX系OSやWindowsでCygwinをインストールしているならば、 上のスクリプトをYYYYMMDD_to_YYYY-MM-DD.sedとして保存して、 次のようにすれば名前の変更ができます。
\ls | sed -f YYYYMMDD_to_YYYY-MM-DD.sed > tmp.sh sh tmp.sh
Top Pageに戻る。 |