Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
165
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

sedのお勉強

概要

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
165
Help us understand the problem. What are the problem?