正しい文字列を一致させた後、sedを使用してLinux yamlファイルに行を追加する方法

正しい文字列を一致させた後、sedを使用してLinux yamlファイルに行を追加する方法

文字列が正確に一致した後、yamlファイルに行を追加する方法が見つかりませんが、行の他の値に似た文字列は無視されます。いくつかの例がありますが、私の場合ではありません。 yamlファイルがあり、その構成を自動化していて、行番号に移動して手動で値を追加するのではなく、文字列を見つけて、sedコマンドを使用して値を追加しようとしています。

これは例です

私の現在のファイルa.yaml

rules:
  - name: Block PH by GeoIP country
    script: ./rules/Block PH by GeoIP country.js
    stage: login_success
    enabled: false
........
........
........
- name: Preview-1 API (Test Application)
  allowed_clients: []
  app_type: non_interactive
  callbacks: []                             <<<<< -------  see string "callbacks:" with brackets
  client_aliases: []
........
........
........
  allowed_logout_urls:
    - 'http://local.example.com:/login'
  allowed_origins: []
  callbacks:                           <<<<< -------  see string "callbacks:" where I want to append
    - 'http://local.example.com:/callback'

注文する

sed -i "/callbacks:/a \ \ \ \ \ \ - 'https://d1.example.com/callback'" > a.yaml

コマンド結果

My Updated File a.yaml

rules:
  - name: Block PH by GeoIP country
    script: ./rules/Block PH by GeoIP country.js
    stage: login_success
    enabled: false
........
........
........
- name: Preview-1 API (Test Application)
  allowed_clients: []
  app_type: non_interactive
  callbacks: []                             
    - 'https://d1.example.com/callback'   <<<<< -------  see problem here
  client_aliases: []
........
........
........
  allowed_logout_urls:
    - 'http://local.example.com:/login'
  allowed_origins: []
  callbacks:                           
    - 'https://d1.example.com/callback'          <<<<< -------  I appended
    - 'http://local.example.com:/callback'

私が望むもの

    rules:
  - name: Block PH by GeoIP country
    script: ./rules/Block PH by GeoIP country.js
    stage: login_success
    enabled: false
........
........
........
- name: Preview-1 API (Test Application)
  allowed_clients: []
  app_type: non_interactive
  callbacks: []                                <<<<< -------  I don't want to append here
  client_aliases: []
........
........
........
  allowed_logout_urls:
    - 'http://local.example.com:/login'
  allowed_origins: []
  callbacks:                           
    - 'https://d1.example.com/callback'          <<<<< -------  I want my addition only after this
    - 'http://local.example.com:/callback'

一致するすべての文字列の後に行を追加したくありません。上記の例では、callback:[]とcallback:2つの値を持つ2つの行があるので、callback:の後にのみ追加しようとしています。

想像する

Bashスクリプトファイルでsedコマンドを使用したいと思います。 'https://$1.example.com/callback' など、この行の変数値を渡します。コマンドは次のようになります。

sed -i "/callbacks:/a \ \ \ \ \ \ - 'https://$1.example.com/callback'" > a.yaml

これにより、値を渡して次の行を追加してスクリプトを再利用できます。

  callbacks:               
    - 'https://z.example.com/callback'
    - 'https://b.example.com/callback'
    - 'https://d1.example.com/callback'
    - 'http://local.example.com:/callback'

答え1

$以下を使用して行末を一致させることができます。

sed -i "/callbacks:$/a\
\    - 'https://d1.example.com/callback'" a.yaml

関連情報