- ベストアンサー
unix sedコマンドについて
file --------------------------------------- abcdefghijklmnopqrstu abcdefghijklmnopqrstu person=aaa wake walk work abcdefghijklmnopqrstu abcdefghijklmnopqrstu --------------------------------- といったファイルにて このファイルからperson~空白行を「sedコマンド」で削除したいのですがどのようにしたらよいでしょうか。 sedコマンドを使用すると、どうやら、数行あるテキストを一行にまとめ、空白行を見つけたらその行を削除するといった動きになるようです。(一行でそれを行うのでしょうか。。) どなたか、わかる方いたら教えていただけないでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
sed '/^person/,/^$/d' こう?
その他の回答 (2)
- kumoz
- ベストアンサー率64% (120/185)
sed では、次のような基本構文があります。 [address[,address]]command command の前にあるのが address と言われるもので、command の適用対象を 指定することができます。address には、3つのケースがあります。 1) 省略 -- すべての行が command の適用対象になる 2) address -- 1つの address が指定された場合は、マッチした行のみ command が適用される 3) address,address -- 1つ目の address から2つ目の address の範囲の 行が command の適用対象になる address には、行番号アドレスと文脈アドレス (正規表現) の2つがあります。 行番号アドレスと文脈アドレスは組み合わせて使用できます。いくつか例を挙 げてみます。 (1) sed -n '1,5p' file (2) sed '1,/^$/d' file (3) sed '/^cn: person/,/^$/d' file (1) は、よく例として挙げられるのでご存知でしょう。1行目から5行目までを p コマンドの適用対象にせよ、という意味です。(2) は、行アドレスと文脈アド レスを組み合わせたものです。1行目から最初の空行までを d コマンドの適用 対象にせよ、という意味です。(3) は今回の事例で、(1) と (2) と同じように 解釈すればよいだけです。/^on: person/ にマッチする行から /^$/ にマッチす る行までを d コマンドを適用、すなわち削除せよ、という意味になります。 これまでの説明で、カンマの意味が分かると思います。ここでのカンマは、2つ の address を指定する場合の区切り文字の役割を果たします。
お礼
なるほどです。 sedコマンドもそうですが、 表記方法が変わった時にすぐに把握できるようになりたいものです。 投げ出さないで頑張りたいと思います。ありがとうございます。
- a-saitoh
- ベストアンサー率30% (524/1722)
personという文字列が, cn: person=aaa という行にしか出てこないのならさぼって, /person/,/^$/d としても良いです.この場合personだけでなく,personalとかも 引っかけてしまいますが. cn: person= で始まる行に限定するなら, sed '/^cn: person/,/^$/d' でOK. というか,質問するより実際に試した方が早いですよ.
お礼
本当に、どうしたらそんなにスラスラ書けるのだろう::: みごとに該当行をクリアできました。ありがとうございす。 調べても解釈ができずじまいなのでお聞きしたです。 この方法はパターンスペースに一度保存された後、削除といった動きななのでしょうか。 「sed -n 's/^cn: person/,/p'」 →などといったコマンドをやってみたのですが検討違いのようで、、 途中の「/,/」の役割は何でしょうか? 一行一行を連結させる役割かと思ったのですが、調べても調べてもわかりません。 構文的な解釈等、あったら教えていただけないでしょうか。 よろしくお願いします。
お礼
sedやawkコマンドは訳がわからなくなってしまいます。 とてもありがたいです。ありがとうございます。 また、質問がちょっと不十分でして、、 「person」のまえに「cn: 」といった文字列があった場合、 cn: person=aaa wake walk work sed '/^cn: person/,/^$/d' このようにすれば問題ないですか?引き続き回答いただけたらと 思います。よろしくお願いします。。