95043


### 実現したいこと

シェルスクリプトである特定の文字列マッチした次の行以降に別ファイルの内容を挿入したいです。

イメージとして、以下のようなファイルがあるとします。

srcFile

[code]

    1. abc
    2. def
    3. ghi
    
[/code]

ParamFile

[code]

    1. 123
    2. 456
    3. 789
    
[/code]

srcFileは上書きでよいので、コマンド実行後のsrcFileは以下になるイメージです。

srcFile (コマンド実行後)

[code]

    1. abc
    2. def
    3. 123
    4. 456
    5. 789
    6. ghi
    
[/code]

### やったこと

sedを利用して、以下のコマンドを実行しましたが失敗します。

[code]

    a=`cat paramFile`
    sed -i -e "/^def$/a ${a}" srcFile
    
[/code]

  * sedの中で置き換え後の文字列をファイルで渡す方法
  * sedの中で置き換え後の改行を含む文字列の指定方法

どちらかが解れば解消すると思います。どなたか助言をいただけないでしょうか。よろしくお願いします。


CC BY-SA 4.0
2023-05-29T07:21:29.690
95004
2023-05-31T11:14:05.467
2023-05-31T04:23:45.467
3060
40690
question
linux bash shell
sedコマンドで置き換え文字列をファイルから取ることは可能ですか？


ファイル名指定し追加する方法はコメントに付いてるので  
この回答は `a` コマンドで追加する方法です

本来は `'\n'` を指定することで改行文字を表します

[code]

    $ echo -e "abc\ndef\nghi" >srcFile
    $ sed '/^def$/a 123\n456\n789' srcFile
    abc
    def
    123
    456
    789
    hgi
    
[/code]

ファイルから変数に読み込む際に (`'\n'` ではなく)改行コードになるため, sedでは対処できなくなる

[code]

    $ echo -en "123\n456\n789" >ParamFile
    $ echo "$(cat ParamFile)"
    123
    456
    789
    
[/code]

以下のように変換すれば sedで対処可能  
(※ `-z` オプションは gnu版 sed のようです: `sed --version` で確認可能)

[code]

    $ v=$(sed -z 's/\n/\\n/g' ParamFile.txt)
    $ echo $v
    123\n456\n789
    $ sed "/^def$/a${v}" srcFile
    abc
    def
    123
    456
    789
    hgi
    
[/code]


CC BY-SA 4.0
2023-05-31T11:08:51.880
95043
2023-05-31T11:14:05.467
2023-05-31T11:14:05.467
43025
43025
95004
answer