🥺

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

2021/01/07に公開

はじめに

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

概要

■スクリプトの中の文字列を後方参照する
■アドレス指定をしてから置き換え
■区切り文字を変更してみる

をまとめた^^

■スクリプトの中の文字列を後方参照する

sedコマンドではスクリプトの中の文字列を後方参照することができる。
文字列をグループ化して後方参照して置き換えてみた!
文字列は正規表現でも拡張正規表現でも表現することができる。

sedコマンドの後方参照
《正規表現》
\(文字列\)   で文字列指定
\1             で後方参照
《拡張正規表現》(オプション-rが必要)
(文字列)    で文字列指定
\1             で後方参照

なんだか難しそうだ!('_')
しかし難しそうな後方参照をしても

's/置き換え前文字列・置き換え後文字列/g'

ってスクリプトの形は変わらないからよく見ててね!!!
ファイルの中の
my apple
my banana
の my を消して前後に--をはさむよ!
my apple
my banana

--apple--
--banana--
にしたい!ということ。

スクリプト内で後方参照してみる(拡張正規表現バージョン)
$ sed -r 's/my (.*)/--\1--/g' fruit.txt
apple
appleapple
apple apple apple
appleappleappleappleapple!!!
--apple--
--banana--

ヤッホーできた!('_')

(.*) で任意の一文字を0回以上繰り返しでランダムな文字列を指定、
\1で(.*)を後方参照。--\1--に置き換えるように指定した。

正規表現バージョンでは、

正規表現バージョン
$ sed 's/my \(.*\)/--\1--/g' fruit.txt

になるよ。ちょっと分かりづらいから-rを付けて読みやすくしたほうが分かりやすいね('_')

■アドレス指定してから置き換えもできるぞ!

スクリプトの中のsコマンド単体だと全体を参照して置き換えていたが、一部だけを置き換えしたい時はどうするのだろうか。

スクリプトの中のpコマンドやdコマンド同様にアドレス指定できる。

一部を置き換え指定(1行目から3行目を置き換え指定)
$ sed '1,3s/apple/melon/g' fruit.txt
melon
melonmelon
melon melon melon
appleappleappleappleapple!!!
my apple
my banana

p,dコマンドみたいに
1行目から3行目を
1,3
で指定できるね!

■区切り文字を変更してみる

ではスラッシュ/を置き換えてみよう。
apple

/apple/
にしたい!ということは...

$ sed 's/apple//apple//g' fruit.txt

でいいの?('_')

$ sed 's/apple//apple//g' fruit.txt
sed: -e expression #1, char 10: unknown option to `s'

※それは未知のオプションですねって言われた。
区切り文字を置き換えする時は、

/に\をつけて未知のオプションにならないようにエスケープする。
\/
と書く。
やってみる
$ sed 's/apple/\/apple\//g' fruit.txt
/apple/
/apple//apple/
/apple/ /apple/ /apple/
/apple//apple//apple//apple//apple/!!!
my /apple/
my banana

できたね!
2文字打つのがめんどくさかったらこうでもいいらしい。↓

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

どうやらsの後ろの文字が自動的にスクリプトの中の区切り文字として認識されるためAでも%でも!でもなんでもいいそうだ(>_<)
/が純粋に/ってかけるね。
もう好きにして!

まとめ

新年早々1日早く会社に行っちゃったけど、引っ越し後にプリンター屋さんがバックレて来ないしプロッターも調子悪いからネットサーフィンしながらお菓子食べてばっかりなので明日から働く!

水道屋さんはこんなことができるようになった!
どうだ!!!(@_@)

Discussion