以下は、"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)
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コマンドを避ける理由はないと思います。
あと、「最初の一回」を「最初の○回」にするようなことも多分出来ると思うのですが、ちょっと力不足。
お示し頂いたパターンでは、ともに「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 のバージョンの違いによるのかもしれませんね。
いずれも私にとっては暗号のようで、精進する必要を痛感しています。
皆様ありがとうございました。
No.3
- 回答日時:
> 処理対象のテキストには、/PATTERN/ にマッチする箇所が複数あります。
> このような場合に、最初にマッチした箇所にのみSTRINGを挿入するということは可能でしょうか?
i コマンドを使わずに、/PATTERN/ にマッチする行をホールドスペースに保管しておいて、
パターンスペースを STRING に置き換えて、ホールドスペースを追加するとできると思います。
sed -e '1,/PATTERN/{ /PATTERN/!b; h; s/.*/STRING/; G; }'
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- その他(プログラミング・Web制作) sedの正規表現 1 2022/10/08 18:57
- その他(プログラミング・Web制作) sedの動作 2 2022/10/10 13:38
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Perl perlについての質問 2 2022/10/17 15:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
iqoo neo 9と言うスマホがある...
-
AIXでの文字コード、改行コード...
-
DOSコマンドについて
-
アクセスのボタンから指定のワ...
-
echo $!の意味を教えてください
-
UNIX コマンドにおける # や円...
-
Powershell エクセル検索 完全...
-
cd-romドライブを閉じる コマ...
-
クイックアクセスツールバーに...
-
linuxのファイル名の長さを255B...
-
telinit 読み方を教えてください
-
[バッチファイル]レジストリ値...
-
コマンドの戻り値リファレンス
-
mac で Googleマップ 切り取り
-
「bash:ipconfig:command not f...
-
シェルスクリプトでパスワード...
-
Macでldコマンド、ldconfigコマ...
-
コマンド履歴が~/.bash_history...
-
「環境変数名の編集」ウィンド...
-
vbaで「最前面に」とする方法は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UNIX コマンドにおける # や円...
-
SCコマンドでアクセス拒否
-
[バッチファイル]レジストリ値...
-
Ctrl+Zで戻りすぎた場合、逆に...
-
Excel下部のメニューが消えた
-
「環境変数名の編集」ウィンド...
-
【Gmailコマンド】1年以上前の...
-
vbaで「最前面に」とする方法は?
-
Linuxコマンドは何の言語で書か...
-
ワイルドカードを使ってでフォ...
-
アクセスのボタンから指定のワ...
-
AIXでの文字コード、改行コード...
-
shutdownコマンドをキャンセル...
-
compressコマンドってなくなっ...
-
Linux:sedコマンドで置換がし...
-
閉じている全ての+ボタンを一...
-
コマンドプロンプトにおけるコ...
-
Powershell エクセル検索 完全...
-
VBAを使って電源を切るには?
-
バーチャルBOX Windows 95 セッ...
おすすめ情報