Linuxで文字列を操作しデータを整形する方法について、各手法の特性や基本的な文法などを確認する。
今回はsedについて。
#■sedについて
Stream EDitor の略であるsedは、名前の通りに入力ストリームに対しテキスト変換処理を行い結果を出力する。
Linuxコマンドとしては、文字列をパイプを用いた標準入力、あるいはファイル指定による読み込みで入力し、スクリプトにより編集した後に結果を標準出力に出力するか、読み込み元ファイルを上書きする。
$ echo 'good morning' | sed -e 's/morning/evening/g'
good evening
構文は後述するが、例ex1では'good morning'という文字列を入力とし、
入力テキスト中の'morning'という文字列を'evening'に置換する編集処理を行い
出力している。
#■基本的構文
sed [-オプション] '[アドレス]コマンド文字[コマンドパラメータ]' [入力ファイル]
ここで言う"アドレス"とはコマンド実行対象行のことであり、
数値による行番号の指定や正規表現によるマッチング判定での行指定などが行える。
sed -e '4s/white/black/' /var/tmp/goods.txt
ex2の場合
'-e' がオプション
'4' がアドレス
's' がコマンド文字
'/white/black/' がコマンドパラメータ
'/var/tmp/goods.txt' が入力ファイル
にあたり、
goods.txtの4行目の'white'を'black'に置換するというような処理になる。
#■代表的オプション
-e
後ろに続く文をスクリプトとして解釈し実行する。
これを用いることで、コマンドを複数実行することも可。
sed -e 's/a/b/' -e 's/c/d/'
ex3の場合、入力に対しaをbに置換し、cをdに置換する。
-f
後ろに続く文をスクリプトのファイル名として解釈し実行する。
-i
入力ファイルを上書きし、スクリプト実行後の状態に更新する。
-n
各行の自動出力を抑制し、明示的に出力したもの以外は出力されないようにする。
なお、-e,-fいずれのオプションも指定されていない場合は
最初のオプションでない引数がスクリプトとして解釈され、
残りの引数は入力ファイルとして解釈される。
#■代表的コマンド
・s コマンド
コマンドパラメータに正規表現によるマッチ式と置換後文字列を指定することで、
入力行の正規表現にマッチした箇所を置換後文字列に置換する。
s/[正規表現]/[置換後文字列]/
なお、最後部に何も書かない状態では、行中で最初にマッチした箇所のみを
置換するが、最後部にgを書くことで行中でマッチした箇所全てを置換する。
s/[正規表現]/[置換後文字列]/g
$ echo aabbcc | sed -e 's/b/d/'
aadbcc
$ echo aabbcc | sed -e 's/b/d/g'
aaddcc
また、置換後文字列文中で'&'を用いることで、
マッチした文字列を表すことができる。
$ echo パン | sed -e 's/パン/フライ&/'
フライパン
・dコマンド
アドレスに指定した行を削除する。
特定行を除いて出力する時などに使用する。
sed '7d' [入力ファイル]
これだけで入力ファイルの7行目以外を出力できる。
・pコマンド
単に指定した行を出力する。
-nオプションと組み合わせ、特定の行のみを出力させることができる。
sed -n '3p' [入力ファイル]
これでex6とは逆に、3行目のみをそのまま出力する。
今回も基礎的な内容のみまとめたが、以上。
正規表現の活用により、複雑なパターンマッチ置換処理も行えるので
文字列操作を行なう際の手法の候補として覚えておきたい。
(参考サイト)
https://hydrocul.github.io/wiki/commands/sed.html
https://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1.html