概要
初めてsed触ったから、覚えたことまとめる
内容
基本
文法
cat before.txt | sed -e 's/before/after/gi'
sed -e 's/before/after/gi' begore.txt
beforeをafterに変換。gは全部変換。iは大文字小文字無視。-e はいくつでも繋げられる。
マッチした文字列の利用
beforeの部分で、\(
と\)
でくくると、afterの部分で\1
で取り出せる。beforeで複数\(\)
を使うと、afterで\2\3\4
な感じで取り出せる。
つまり
$ echo 'abcdefghijklmn' | sed -e "s/.*\(d.*g\).*\(l.*$\)/\1\n\2/g"
defg
lmn
こんな感じ。例がおそまつなのは気にしない。
はまったところ
+
記号
sedでは+
ではなく\+
としないと、直前の文字1個以上の意味で使えない。
他にもバックスラッシュが必要なメタ文字が多い。
参考:正規表現メモ
[追記] 手元のMacのBSDのsedだと\+
でメタ文字として動いてくれなかった。みんなGNUのsed使えばいいと思う。
最短一致と最長一致
sedの正規表現は最長一致なので、最短一致させる時は [^] を使ってなんとかする。
参考:Tech Tips: sedの最短一致
シングルクォーテーションとダブルクォーテーション
-eの引数をシングルクォーテーションでくくって、その中でシングルクォーテーションを使おうとして、シングルクォーテーションをバックスラッシュでエスケープしても動かなかった。
cat before.txt | sed -e 's/.*\'\([^\']\)\'.*/\1/g'
-eの引数をダブルクォーテーションにしたら解決した。
cat before.txt | sed -e "s/.*'\([^']\)'.*/\1/g"
あとで調べたら、\'
はバッファの末尾、という意味のメタ文字だった。
参考:正規表現メモ
参考
- sed - ストリーミングエディタ
- シェル・スクリプト・リファレンス - 【 文字列を置換する「sed」 】:ITpro
- 正規表現メモ
- 逆引きUNIXコマンド/sedを使ってスペースの文字列操作を行う - Linuxと過ごす
感想
色々調べたり読んだり試したりしたけど、まとめるとたいしたことないなあ。
しかも今まとめたのsedの機能のごく一部っぽいから、その内また調べたい。