- ベストアンサー
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)
- みんなの回答 (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コマンドを避ける理由はないと思います。 あと、「最初の一回」を「最初の○回」にするようなことも多分出来ると思うのですが、ちょっと力不足。
その他の回答 (3)
- kumoz
- ベストアンサー率64% (120/185)
> 処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。 > このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか? i コマンドを使わずに、/PATTERN/ にマッチする行をホールドスペースに保管しておいて、 パターンスペースを STRING に置き換えて、ホールドスペースを追加するとできると思います。 sed -e '1,/PATTERN/{ /PATTERN/!b; h; s/.*/STRING/; G; }'
お礼
ありがとうございます。 うまくいきました。
- Tacosan
- ベストアンサー率23% (3656/15482)
素直に sed -e '/PATTERN/i\STRING' じゃダメ?
- notnot
- ベストアンサー率47% (4900/10358)
sed -e '/PATTERN/i\' -e 'STRING'
補足
ありがとうございます。うまく文字列が挿入されました。 恐縮ですが、追加の質問があります。 処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか?
お礼
お示し頂いたパターンでは、ともに「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 のバージョンの違いによるのかもしれませんね。 いずれも私にとっては暗号のようで、精進する必要を痛感しています。 皆様ありがとうございました。