9

大きなファイルで、テキストを編集し、特定の範囲内のコメントを削除する必要があります。_start_この簡単な例では、範囲が で始まり、で終わると仮定します_end_

次のようなコマンドを使用して、問題なくテキストを編集できます。

sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName

次の点に注意してください (もちろん、私の記述が不正確または誤っている場合はお知らせください)。

  • -i別のファイルに書き込むのではなく、「FileName」をその場で編集するように使用しました。
  • -r拡張正規表現を認識できるように使用しました (上記の単純化された例には示されていませんが、正しく機能しているようです)。
  • 変数を正しく処理するために二重引用符を使用しました (上記の単純化された例には示されていませんが、期待どおりに機能します)。

上記のコマンドは、私が期待していることを正確に実行しています。そこで、プロセスの 2 番目のステップに進みました。この範囲内のコメント行を削除する非常によく似たコマンドです。

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

ただし、これは効果がありません。で始まる行#は削除されません。実際、このコマンドを単独で実行すると、ファイル内の何も変更または削除されません。範囲内でも他の場所でもありません。

このサイトや他の場所での検索では、sed を使用して行を削除するための多くの指示 (私が正しく従っていると思われる指示) を見つけましたが、私が経験しているような失敗については何も見つかりませんでした。

ここで私が間違っていることを誰かに教えてもらえますか?

私は UNIX/Linux 環境に非常に慣れていないので、問題を処理する方法について別の提案を受け入れることは間違いありません。しかし、私の欲求不満を満たすために、上記の sed コマンドの何が問題なのか知りたいです。

4

2 に答える 2

8

多くの場合、最良の情報源は man ページです。コマンドでアクセスできますman sed

dman ページに従ってアドレス範囲を取ります。アドレスは、数値、/regexp/、またはその他の数にすることができます。アドレス範囲は、カンマで区切られた 1 つまたは 2 つのアドレスです。アドレス範囲を使用してからアドレスを使用しようとしています。

1_CR が指摘したように、代わりにブロックを使用して回避できます。

sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName

ブロックはアドレス範囲を受け入れ、すべてのコマンドは再びアドレス範囲を受け入れるので、正規表現を組み合わせることができます。

于 2013-10-24T21:13:07.517 に答える