プロが教える店舗&オフィスのセキュリティ対策術

以下は、"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)

A 回答 (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コマンドを避ける理由はないと思います。

あと、「最初の一回」を「最初の○回」にするようなことも多分出来ると思うのですが、ちょっと力不足。
    • good
    • 0
この回答へのお礼

お示し頂いたパターンでは、ともに「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 のバージョンの違いによるのかもしれませんね。

いずれも私にとっては暗号のようで、精進する必要を痛感しています。

皆様ありがとうございました。

お礼日時:2008/07/25 11:21

> 処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。


> このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか?

i コマンドを使わずに、/PATTERN/ にマッチする行をホールドスペースに保管しておいて、
パターンスペースを STRING に置き換えて、ホールドスペースを追加するとできると思います。

sed -e '1,/PATTERN/{ /PATTERN/!b; h; s/.*/STRING/; G; }'
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/25 11:16

素直に


sed -e '/PATTERN/i\STRING'
じゃダメ?
    • good
    • 0

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

この回答への補足

ありがとうございます。うまく文字列が挿入されました。
恐縮ですが、追加の質問があります。

処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか?

補足日時:2008/07/24 22:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!