• ベストアンサー

sed 1行スクリプト

以下は、"PATTERN" にマッチする行の直前の行に、文字列"STRING"を挿入する sed スクリプトで、sed -f で期待どおりの動作をします。 ---------- /PATTERN/ i\ STRING ---------- ここで、PATTERN及びSTRINGは空白文字を含みます。 これを、sed の -e オプションを使って、1行コマンドで実行したいのですが、どうにもこうにもうまくいきません。 sedの基本が身についていないだけなのですが、お知恵を拝借できないでしょうか? 実行環境は次のとおりです。 GNU bash, version 2.04.0(1)-release (i686-pc-msys)

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

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

#1です。 >このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか? sed -e '/PATTERN/{i\STRING' -e ':loop;$q;n;b loop;}' のようなださい物しか考えつかなかったのですが、#3の方のアイデアを使って、 sed -e '1,/PATTERN/{/PATTERN/!b;i\STRING' -e '}' でいいですね。iコマンドを避ける理由はないと思います。 あと、「最初の一回」を「最初の○回」にするようなことも多分出来ると思うのですが、ちょっと力不足。

astronaut
質問者

お礼

お示し頂いたパターンでは、ともに「Extra characters after command」というエラーが出てしまいましたが、前回教えて頂いた経験をもとに、 sed -e '/PATTERN/{i\' -e 'STRING' -e ':loop;$q;n;b loop;}' sed -e '1,/PATTERN/{/PATTERN/!b;i\' -e 'STRING' -e '}' と修正したら、両方ともうまくいきました。 sed あるいは shell のバージョンの違いによるのかもしれませんね。 いずれも私にとっては暗号のようで、精進する必要を痛感しています。 皆様ありがとうございました。

その他の回答 (3)

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

> 処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。 > このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか? i コマンドを使わずに、/PATTERN/ にマッチする行をホールドスペースに保管しておいて、 パターンスペースを STRING に置き換えて、ホールドスペースを追加するとできると思います。 sed -e '1,/PATTERN/{ /PATTERN/!b; h; s/.*/STRING/; G; }'

astronaut
質問者

お礼

ありがとうございます。 うまくいきました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

素直に sed -e '/PATTERN/i\STRING' じゃダメ?

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

sed -e '/PATTERN/i\' -e 'STRING'

astronaut
質問者

補足

ありがとうございます。うまく文字列が挿入されました。 恐縮ですが、追加の質問があります。 処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか?

関連するQ&A