🐜

Linuxさんで安全にテキストを編集せずにテキストを編集する!①

2021/01/06に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんには超大量のテキストがあって、検索するだけではなくたくさんテキスト編集処理もする。
今回はテキストを便利に編集できるように非対話型エディタのsedコマンドを勉強しようと思う。

概要

■対話型エディタと非対話型エディタ
■sedコマンド
■行を削除する
■行を表示する
■行を置き換えする

をまとめた!

対話型エディタと非対話型エディタ

■対話型エディタとは

vimのようにエディタでファイルを開いて編集し、編集が終わってから保存するタイプのやつ。

■非対話型エディタとは

vimのようにエディタで開かず、コマンド上で編集対象を指定して一部分を編集する。
編集後の内容をsedコマンドが標準出力で出力する。といった流れになる。
(えぇ!普通にvimでいいじゃん!って思っちゃった(@@)vimでもいろいろできるし!)
編集後の内容をsedコマンドが標準出力で出力するっていうのが気に入らないんだけど
編集結果を標準出力に出力するだけなので元のファイルは変更しないそう!
なのでテキストを編集せずにテキストを編集することができる!
編集した出力だけ参照することができる。
中途半端すぎない?('
')仲良くなれるの?
でも、標準出力に出力されるだけなので、お試しにファイルを編集したりコマンドの出力結果を見やすく編集するのにも使われるそうだ。

■sedコマンド書式

$ sed オプション スクリプト 対象ファイル

待って('_')スクリプトってなに。

■スクリプトとは

スクリプトとはアドレスとコマンドを組み合わせた文字列だ。コマンドはさらに引数やフラグをとることができる。
待って('_')フラグって誰。(フラグさんは↓で紹介するよ!)
今回はこんなファイルをsedコマンドでいじってみる。

$ cat fruit.txt
apple
appleapple
apple apple apple
appleappleappleappleapple!!!
my apple
my banana

めっちゃりんごが大好きな奴だな('_')

■行を削除する

sadコマンドはアドレスで指定された行に反応する。
アドレスの指定にはいくつかの形式がある。
↓1行目を削除する

$ sed 1d fruit.txt
appleapple
apple apple apple
appleappleappleappleapple!!!
my apple
my banana

消えた!行指定はシンプルに数字なのか!
dは消すのか!多分deleteって意味だな!
↓そして1行目から4行目を削除する

$ sed 1,4d fruit.txt
my apple
my banana

消えた!行から行を指定する時は,を使うのか!
↓2行目から最終行までを削除

$ sed '2,$d' furuit.txt
apple

2行目から最後まで消えた!
なるほど、$なので最後まで消すのには金がかかるけど、ちゃんと''(クォーテーション)で守ってってことかな。
というのは違くて、クォーテーションで囲わないと、シェルに別の意味で解釈されてしまうので、
''で囲うのだそうだ。
もしかして、と思って

$ sed '1d' fruit.txt
$ sed '1,4d' fruit.txt

って最初の二回でやったスクリプトを''で囲ったら同じ結果が出力された。
スクリプトを''で囲うか囲わないか迷ったら囲んでもいいのかもしれない。
スクリプトは正規表現で書くこともできる!
↓しかし、sedコマンドで正規表現を使う時は、''でなく、//で囲う

$ sed /^a/d fruit.txt
my apple
my banana

aで始まる行が消えた!

■行を表示する

pは表示するコマンドだそうだ。

$  sed 1p fruit.txt
apple
apple
appleapple
apple apple apple
appleappleappleappleapple!!!
my apple
my banana

あれ?1行目が2回表示されている。
sed ○○○pは出力の仕方がちょっと特殊で、指定された所が出力されたらもう一度フル出力してくれるそうだ。
なんか中途半端だな('_')
ちなみにフル出力がいらない場合、-nオプションを付け足す。

$ sed -n 1p fruit.txt
apple

指定したところだけでた!

■行を置き換えする

これが一番sedコマンドで使われるやつらしい('_')
↓置き換えスクリプト

's/置き換え文字列/置き換え後文字列/フラグ'

まって('_')ほんとにフラグって誰?

「フラグは置換の動作を変更するもので、0個以上指定できる。」

...らしい。
ということはフラグとは置き換えの動作を指定できるやつで、省略することができるってこと?
文字列を置き換えするのには、gをおしりにフラグとして置く。
↓ひとまずやってみよう

$ sed 's/apple/melon/g' fruit.txt
melon
melonmelon
melon melon melon
melonmelonmelonmelonmelon!!!
my melon
my banana

s&g(えすあんどじー!)文字列文字列で置き換え!と覚えた!
メロンがいっぱいになった。
↓gで置き換えをしないと

$ sed  's/apple/melon/' fruit.txt
melon
melonapple
melon apple apple
melonappleappleappleapple!!!
my melon
my banana

ありゃ、
melonapple
melon apple apple
で文字列の最初に該当してるappleだけが置き換えされた。
フラグを省略すると最初の文字列だけが該当するそうだ。
↓置き換え文字列に正規表現を利用することもできるぞ!

$ sed  's/a.*e/melon/g' fruit.txt

.*で任意の一文字を0回以上繰り返しで正規表現を表現した!!!はぁはぁ('_')
↓文字列を削除したい時はシンプルに空欄

$  sed 's/!//g' fruit.txt
apple
appleapple
apple apple apple
appleappleappleappleapple
my apple
my banana

!!!が消えた。
↓フル出力を表示しない-nと置き換えが発生した時に出力するpフラグとの組み合わせで置き換えが発生した行だけを表示する。

$sed -n 's/!//gp' fruit.txt
appleappleappleappleapple

えすじーにえぬぴーで置き換え後だけ出力!
おぼえられるか!(>_<)w
ちなみに拡張正規表現で表現したい時は、-rをつけること。

$ sed -r 's/ap+le/melon/g' fruit.txt
melon
melonmelon
melon melon melon
melonmelonmelonmelonmelon!!!
my melon
my banana

一瞬まとめ

-nでフル出力を消す
-rで拡張正規表現を使う

...これは正規表現と拡張正規表現を使いこなすいい経験になりそうだ...!!!
超絶めんどくさいけどこんなことだってできるぞ!

$ sed -r 's/ap+le/melon/g' fruit.txt
$ sed 's/ap\+le/melon/g' fruit.txt

いっぱい正規表現と拡張正規表現のおさらいができていいね!
つまり拡張正規表現をオプションなしで表現するのができればこちらも-rがいらないってことだね!

まとめ

長いので続く^^

Discussion