• ベストアンサー

シェルで文字列を含んだ行だけを削除したい!

文字列を含んだ行だけを削除したいと思って、 sed -e "/XXXXXXXX/d" destfile > destfile または grep -v XXXXXXXX destfile > destfile とやったら、全部消えてしまいました!(^^;) どうしてですか? そして、どうしたら正しい処理になりますか? すみません。シェル初心者です。 易しく、わかりやすく、教えて下さい!

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

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

sed や grep に限りませんが、 入力ファイルと出力ファイルが同じというのはいけません。 出力ファイルを開いた時点でそのファイルの内容は消えます。 それを読み込んで処理しようとしているのですから、 うまくいかないのは当然です。 sed -e "/XXXXXXXX/d" destfile > tmpfile mv tmpfile destfile のようにすればできると思います。

goonejp
質問者

お礼

そうですね! ファイルを二つに分けるといいのがわかりました! あと、tmpfileを消すコマンドも含めて、三つをコピペで、とりあえず、やって見ます! その消すコマンドも、調べなくちゃわからないのですが…。(^^;) ありがとう御座います!

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

>sed -e "/XXXXXXXX/d" destfile > destfile >または >grep -v XXXXXXXX destfile > destfile >とやったら、全部消えてしまいました!(^^;) >どうしてですか? シェルで ほげほげ > destfile と打つと「ほげほげ」の部分が何であっても、まず最初に destfile が「新規作成」されます。そして、その後に「ほげほげ」を実行しようとします。 cat destfile > destfile この例では、まず、destfile が新規作成(元の内容はすべて捨てられる)され、次に、cat が起動され、cat は新規作成されて中身の無い destfile を読み込みますが中身が無い為にすぐに終了し、最後に destfile がクローズされます。 つまり、destfile の中身は全部消えてしまいます。 >そして、どうしたら正しい処理になりますか? >すみません。シェル初心者です。 >易しく、わかりやすく、教えて下さい! まずは、リダイレクトとパイプについての動作原理(誰がファイルを開き、誰がファイルを作成し、誰がファイルをクローズしているのか)を理解する必要があります。 その先(どうしたら正しい処理になるか)に進むのは、質問者さんには早過ぎます(笑)

goonejp
質問者

お礼

わかりやすい説明で、本当に勉強なりました。 ひょっとしたら「ギャル文字」で説明してくれる女の子もいるかも知れない!と思いながら質問した(^^;)のですが、まだまだ、わからないことが多い割りに、今後、使えると便利な機会も増えそうなので、また、機会がありましたら、是非、よろしくお願い致します。

関連するQ&A

  • ある単語を含む行と、1つ前の行とを削除するシェル

    UNIX初心者です。 シェル(Korn)で、あるファイル中に、単語 "iwa"を含んだら、その行と、1つ前の行とを削除したいシェルを作りたいのです。  つまり、grep, sed, awk などで、"iwa"を含む行がみつかったら、その行(iwaを含む行)と、なおかつ、1行前の合わせて、2行を削除するシェルを作りたいのですが、行番号(NR?)などを使うのでしょうか? よろしく、お願いします。

  • シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入

    こんにちは。 シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入したいと思います。 ・sample.txt (挿入前) -- <ABC> <ABC> Hello! </ABC> </ABC> -- ↓ ・sample.txt (挿入後) -- <ABC> <ABC> Hello! </ABC> Good Morning Good Evening </ABC> -- 上記のように、テキスト末尾から検索して、 はじめて表れた"</ABC>"のタグの前に、 Good Morning Good Evening という2行の文字列(無理なら1行でも)を追加したいと考えています。 "</ABC>"タグは2つありますが、末尾から検索して初めて表れたもののみ対象です。 このような操作を行うには、 どのようにシェルを組み合わせれば良いのでしょうか? grepやsedを用いて考えてはいますが、よく分かりません。 (grepで末尾から初めて表れた"</ABC>"の行番号を取得し、 その上に、sedで文字列を挿入するなどですが・・・よく分かりません) どなたか、よろしくお願いします。

  • awkで特定の範囲の行を削除したい

    awkなどの使い方がよくわからないので教えてください。 あるテキストファイル中の、"del_start" という文字が入った行から"del_end" という文字が入った行までの全ての行を削除したファイルを作るシェルを作成したいと思っています。 awk(やsed、grep、cat ?)などを使って実現するにはどうすればいいのでしょうか? よろしくお願いします。

  • 特定の文字列を含む行だけ削除する方法?

    いつもお世話になっています。 Unixであるテキストファイルから、 特定の文字列を含む行(レコード)だけを 削除する方法を教えてください。 現在、grepを使って、いろいろ試しているのですが、 正規表現で、 ”***”を含まない行(レコード)だけを 切り出すとう正規表現の説明が見あたりません。 "^**"は、**以外の文字を検索できるようですが、 文字列に対しては、使えません。 grep以外の方法でも良いのですが、 なるべくシンプルにできる方法がありましたら 教えてください。 宜敷お願いします。

  • 100文字が並ぶテキストを10行10列にする方法(Bシェルにて)

    100文字が並ぶテキストをBシェルにて10行10列にする方法を教えてください。 テキスト(test.txt)には、次のようにスペースで区切られて100文字入っています。(この例の様に規則性はありません) 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ..(省略) ↓これを 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 (省略) の様にするやり方を教えてください。 Bシェル初心者です。宜しくお願い致します。

  • 削除される行と、されない行があります

    VBAで、もしD列とE列が同じ数字ならその行を削除、 という式を作りました。なお、D列が0より大きいときに その式を適用するようにしました。 なぜか、D列とE鉄が同じ場合は、きちんと削除されるのに、 ある行だけ削除されません。 理由がわかりませんでした。 どのようなことが考えられますか。 D列もE列も半角で数字が入っていました。

  • 【シェル】複数の行の列を1行で表示したい

    お世話になります。 掲題の件で質問します。 現在、Linux上でシェルの開発を行っています。 処理としては、テキストファイルを読み込んで、各行の先頭列 のみ1行で表示させるものなのですが、望みの状態が得られません。 何か良い方法はないでしょうか。 有識者の方がいらっしゃれば、アドバイス願います。 ○試したこと grep を試したのですが、1行で表示されてしまいます。 # テキストデータの形式 1行目 AAA aaa 2行目 BBB bbb 3行目 CCC ccc # 望みの状態 AAABBBCCC 環境 Linux

  • 特定文字列を含まない行を削除

    以前特定文字列を含む行を削除する方法の質問をし、正規表現を置換することでできることを知りました。^.*特定の文字列.*\n 今度は特定文字列を含まない行を削除を削除したいです。 この場合どう記述すればいいでしょうか? また、特定文字列1と特定文字列2のどちらかを含まない行を削除する方法もあわせて知りたいです。

  • 指定した文字列を含む行から、指定した文字列を

    含む行まで、全ての行を抽出して別ファイル(名前は元ファイルと同じ)としたいのです。 対象ファイルに結果を上書きでもかまいません。 指定したフォルダの中にある複数のフォルダ各々に1つずつ入っているテキストファイルが対象になります。 例) 東京都 新宿区 <start123AAA> 東京都 港区 <end>AAABBB 東京都 目黒区 どのファイルにも必ず<start と<end の文字列があります。(必ず1組です) <start の文字列を含む行から <end の文字列を含む行までを 抽出したいのです。 (欲しい結果↓) <start123AAA> 東京都 港区 <end>AAABBB フリーのエディタソフトのgrep、grepのマクロ、バッチでできないものかと試してみているのですが どうしてもうまくいきません。 抽出したい範囲、削除する範囲には禁則文字?が入っているのでバッチは難しいのでしょうか? できればバッチで処理できればなと思っているのですが、うまくいきません。 (<>!""/ あたりが入っています。別の文字に置き換えることは可能です) 範囲を抽出ではなく、 <startを含む行の一つ上の行から前を全て削除 <endを含む行の一つしたの行から後を全て削除 する方法や VBAで、スタート行をとエンド行をSearchして抽出する方法など ご教授いただきたくお願い致します。

  • シェルで文字列を置換したい。

    UNIXのシェルであるファイルに書かれている文字から ある文字列を置換してそのファイルの中身を書き換えたいのですが どう書いていいのかわかりません。 ファイルを読み込んで該当の文字列を含んだ行を 見つけるところまではいったのですが・・・。 どなたか教えてください! よろしくお願いします。

専門家に質問してみよう