• 締切済み

【正規表現】検索文字の前後の行を削除したい

正規表現がらみで困っていることがあります。 とあるディレクト以下にある複数ファイルの中身を検索して、該当する文字列にヒットした場合その文字列の行とその前後の行を削除したいと思っております。 該当文字列は1ファイルの中に複数ありますが、連続はしてないことはわかっております。 ※ちなみにディレクトリ以下としておりますが、ディレクトリの下にはサブディレクトリが数階層あり、サブディレクトリの中のファイルも検索対象です。 現状findとsedで試行錯誤トライ&エラーを繰り返し中 どなたかお力頂戴できれば幸いです。 どうぞよろしくお願いいたします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

> 444,446d -e 926,928d それはあり得ない。 -e 444,446d -e 926,928d ならあり得ますが。 やはりタイプミスが原因だと思います。 よくみて再度トライしてください。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

タイプミスですかね? echo `awk '/正規表現/{print "-e " NR-1 "," NR+1 "d"}' ファイル` で、どう表示されますか?

sysmhkns
質問者

お礼

444,446d -e 926,928d で、対象の行が出力されます。 >sed: -e 表現 #1, 文字数 1: 未知のコマンドです: 「.」 >で、ファイルの中身が全部消えて上書きされております。 と記載しましたが、 sed: -e 表現 #1, 文字数 1: 未知のコマンドです: 「.」 はやはりでますが、中身が消えたのは2回叩いたからのようです。 1回ではsed: -e 表現 #1, 文字数 1: 未知のコマンドです: 「.」と怒られるものの、中身消えはしませんでした。 すみません。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

個々のファイルは、 sed `awk '/正規表現/{print "-e " NR-1 "," NR+1 "d"}' $FILE` $FILE > $FILE.out mv $FILE.out $FILE でいけると思います。 ちゃんと考えればawkだけで出来ますが、面倒なので、sedとの組み合わせで。 あとは、findを使って全ファイルを対象に。 find /some/dir -type f | while read FILE do sed ~~ mv ~~ done

sysmhkns
質問者

お礼

ありがとうございます。かなり近づいてうれしいです。 sedが失敗している模様。コマンドの範囲をsedがわからないのかなと。 sed: -e 表現 #1, 文字数 1: 未知のコマンドです: 「.」 で、ファイルの中身が全部消えて上書きされております。 このあたり何かお分かりになりますでしょうか? 知識不足ですみません。 宜しくお願いいたします。

関連するQ&A