179
167

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sedのお勉強

Last updated at Posted at 2012-12-26

概要

初めて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の機能のごく一部っぽいから、その内また調べたい。

179
167
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
179
167

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?