• ベストアンサー

unix sedコマンドについて

file --------------------------------------- abcdefghijklmnopqrstu abcdefghijklmnopqrstu person=aaa wake walk work abcdefghijklmnopqrstu abcdefghijklmnopqrstu --------------------------------- といったファイルにて このファイルからperson~空白行を「sedコマンド」で削除したいのですがどのようにしたらよいでしょうか。 sedコマンドを使用すると、どうやら、数行あるテキストを一行にまとめ、空白行を見つけたらその行を削除するといった動きになるようです。(一行でそれを行うのでしょうか。。) どなたか、わかる方いたら教えていただけないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

sed '/^person/,/^$/d' こう?

iamafraid
質問者

お礼

sedやawkコマンドは訳がわからなくなってしまいます。 とてもありがたいです。ありがとうございます。 また、質問がちょっと不十分でして、、 「person」のまえに「cn: 」といった文字列があった場合、 cn: person=aaa wake walk work sed '/^cn: person/,/^$/d' このようにすれば問題ないですか?引き続き回答いただけたらと 思います。よろしくお願いします。。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

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 を指定する場合の区切り文字の役割を果たします。

iamafraid
質問者

お礼

なるほどです。 sedコマンドもそうですが、 表記方法が変わった時にすぐに把握できるようになりたいものです。 投げ出さないで頑張りたいと思います。ありがとうございます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

personという文字列が, cn: person=aaa という行にしか出てこないのならさぼって, /person/,/^$/d としても良いです.この場合personだけでなく,personalとかも 引っかけてしまいますが. cn: person= で始まる行に限定するなら, sed '/^cn: person/,/^$/d' でOK. というか,質問するより実際に試した方が早いですよ.

iamafraid
質問者

お礼

本当に、どうしたらそんなにスラスラ書けるのだろう::: みごとに該当行をクリアできました。ありがとうございす。 調べても解釈ができずじまいなのでお聞きしたです。 この方法はパターンスペースに一度保存された後、削除といった動きななのでしょうか。 「sed -n 's/^cn: person/,/p'」 →などといったコマンドをやってみたのですが検討違いのようで、、 途中の「/,/」の役割は何でしょうか? 一行一行を連結させる役割かと思ったのですが、調べても調べてもわかりません。 構文的な解釈等、あったら教えていただけないでしょうか。 よろしくお願いします。

関連するQ&A

  • UNIX sedの使い方

    教えてください。 UNIX のSed コマンドについてです。 [内容] テキストの中身を一行ずつ表示し、一行ずつ書き込みをしたい。 [ソース] #!/bin/sh i=1 while [ "$i" -le 10 ] do sed -n '${i}p' list.txt >> data.txt <--ここのsedの行数指定('${i}p')の使い方がわかりません。 i=`expr $i + 1` done 何方かご存知の方教えてくださいませ。

  • grep,sedコマンドについて

    昨日に引き続き、またまた質問です。 昨日回答してくださった方、ありがとうございました。 その後自分でも色々勉強しまして、ファイルの中身を処理するにはgrepコマンドとsedコマンドが 有効である事が分かりました。 今回やりたいことは以下のファイルの数字と時間の部分(//のついている2行)の削除です //1 //00:00:03,600 --> 00:00:07,195 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx //2 //00:00:07,360 --> 00:00:09,635 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx     ・     ・ (実際のファイルには"//"はついていません) 理想の出力 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx (xxxxxの部分には英語の台詞が入ります) で、以下が自分が考えた方法です 1.sedコマンドのみで削除 $ sed "/[0-9]*\n[0-9][0-9].*/d" ファイル名 結果 ファイルの内容がすべて表示されるだけ (a) 2.grepコマンドで抽出しパイプ処理 まずgrepで削除部分を抽出 $ grep -P "^[0-9]*\n[0-9][0-9].*" ファイル名 結果 1    00:00:03,600 --> 00:00:07,195    2    00:00:07,360 --> 00:00:09,635         ・         ・    10    11         ・         ・ となり、1~9までの数字と時間はちゃんと表示され 10以降は数字しか出ません。 (b) また -P の部分を -E にすると、何も表示されません (c) (perlの正規表現と拡張正規表現の違いはここでは無いように思えますが・・・) 2は最初でつまづいたのでどのコマンドに渡して行を削除するかはまだ分かりません (d) 削除の際、2行まとめて行うのは、一行ずつ行うと、台詞の部分に数字のみが入っていた場合 削除されるのを防ぐためです 以上長くなりましたが(a)~(d)の質問、疑問に回答していただけると嬉しいです。 よろしくお願いします。

  • Linux sedコマンド 特定行の置換

    こんにちは テキストファイルの内容をsedコマンドで特定の行の頭に#を付けるようにしたいのですが、 うまくいきません。どのようにしたら良いでしょうか。 --実行前の内容-- * * * * * /tmp/tst.sh * * * * * /opt/aaa.sh --想定結果-- #* * * * * /tmp/tst.sh * * * * * /opt/aaa.sh

  • sedコマンドによる最終行の削除について

    sedコマンドを使用してファイルの最終行を削除する方法を調べていたのですが 最終行の削除は問題なくできたのですが最終行から特定行までを消すため以下のコマンドを発行したのですがうまくいきませんでした。複数サイトを見てみたんですが構文自体は同じでしたのでおそらく問題ないとは思うですが何か気づく方がいたらお教えください。 以下実行コマンド sed -e '$-3,$d' sed_test.txt

  • sedコマンドで指定の行まで削除

    sedコマンドで1行目から、例えば「FLAG」と書かれた行までを削除したい場合どう書けばよろしいでしょうか。 sedコマンド以外に有用なコマンドがあれば、そちらも教えていただきたいです。 よろしくお願いします。

  • sedコマンドに関して

    サーバーにあるファイルの中身を置換する為 Tera Termのsedコマンドを使おうとしたのですが 文字列の「'」が置換できません。 以下のように入力してみましたがだめでした。 sed -e 's/'/'aa/g' text1.txt > text2.txt sed -e 's/\'/\'aa/g' text1.txt > text2.txt 出来ないんでしょうか!? 宜しくお願いいたします。

  • sedコマンド 先頭に空白文字を含む行の挿入

    よろしくお願いします。 [やりたい事] linaxサーバで、行の先頭に空白を3個含む文字列aaaを、/tmp/abc.cnfの3行目に挿入したいですが下記[実施コマンド]ではうまくいかず、上手くいくコマンドラインを教えて下さい。 [実施コマンド] sed -e ”3i <space><space><space>aaa” /tmp/abc.cnf [/tmp/abc.cnf]の中身 △△△123 △△△456 △△△aaa ←コマンドで挿入したい △△△666 △△△777 よろしくお願いします

  • sedコマンドについて

    sedコマンドについてご存知の方いたらお願いします。 cn: main=bread, fruit=apple, drink=coffee, dessert=cake といった文字列があった場合、 fruit=apple だけを「sed」コマンドを使用して 表示あるいはファイルへ出力する方法を教えていただけないでしょうか。 よろしくお願いします。

  • sed コマンド

    sedを使って、行の中の単語を修正しようとしています。うまくいきません。サジェスチョンをお願いできますか? やりたいこと:  (tab) xxxxx01 (tab) --->(tab) xxxxx01_aaa (tab) (tab) xxxxx02 (tab) --->(tab) xxxxx02_aaa (tab) (tab) xxxxx03 (tab) --->(tab) xxxxx03_aaa (tab) sed -e 's/ xxxxx0(\d) / xxxxx0\1_aaa /' file.txt > file2.txt エラーメッセージは、\1の参照が適当ではない、と言うものです。 宜しくお願い致します。

  • UNIX: catコマンドで無限ループ???

    正確にはOS X 10.9.5のbashですが、UNIX一般の質問と思われるのでこのようなタイトルにしました。 catコマンドで、あるテキストファイルのあとに、同じテキストファイルをつくろうと思いましたが、無限ループになってしまい、巨大ファイルができてしまいます。 最初、このようにしてa.txtという1行のファイルを作りました。  [~]$ cat > a.txt  aaa それで、同じa.txtを  aaa  aaa という2行のファイルにしたいと思い、以下のようなコマンドを入力しました。 [~]$ cat a.txt >> a.txt 自分の目論見としては、a.txtの内容がa.txtに追加されるので、2行になるかと思いましたが、応答がなくなりました。 Ctrl+Cで停止し、a.txtの内容を見ると [~]$ cat a.txt aaa aaa aaa aaa aaa aaa ・・・・・・ と何千行も入っています。 ファイルのサイズはこれぐらいでした。 [~]$ ls -al a.txt -rw-r--r-- 1 TYWalker staff 16898724 9 22 12:57 a.txt これは、なぜこのような現象になるのでしょうか。 また、私が本来やろうとしたことを、簡単なコマンドで行うにはどうすればいいでしょうか。 よろしくお願いします。

専門家に質問してみよう