sed - 必要に応じて引用符を使用するように値を置き換えます。

sed - 必要に応じて引用符を使用するように値を置き換えます。

100を超えるjinjaテンプレートファイルがあり、"value:..."文字列が各ファイルに0-k回表示されます。問題は、いくつかのファイルが以下を使用していることです。

value: something

そのうちのいくつかは次のとおりです。

value: 'something'

それらのいくつか:

value: "some other thing"

二重引用符を使用して、すべて同じように見えるようにする必要があります。私はこれを行うためにsedを使うと思います。

sed -i 's/value: ['"]?(.*)['"]?/value: "\1"/g' *.j2

しかし、私が見たように、私はsedが嫌いだったので、過去2時間で終了しなかった "s"コマンドなどの無意味なエラーメッセージでキーボードを破壊したかったのです。

入力例:

- param:
  name: Command
  type: String
  value: '/bin/echo'
- param:
  name: Args
  type: String
  value: Hello World
- param:
  name: Something
  type: EnvVar
  value: "PATH"

これから私は以下を得るべきです:

- param:
  name: Command
  type: String
  value: "/bin/echo"
- param:
  name: Args
  type: String
  value: "Hello World"
- param:
  name: Something
  type: EnvVar
  value: "PATH"

ベストアンサー1

"'式に両方の形式の引用符()を使用する必要がある場合、状況は難しくなります。まず、最初の試みでは、シェルはそれを引用符's/value: ['付き文字列として識別します。後者の引用は保存されません。

このような場合は心配する必要はありません。 Sedコマンドをファイルに入れます。その内容はシェル操作の対象になりません。

quotes.sed:

# (1) If line matches this regex (value: '), 
# (2) substitute the first ' with " and
# (3) substitute the ' in the end-of-line with ".
/value: '/{
  s/'/"/
  s/'$/"/
}
# (4) If line matches this regex (value: [^"]), 
# (5) substitute :<space> for :<space>" and
# (6) append a " in the end-of-line.
/value: [^"]/{
  s/: /: "/
  s/$/"/
}
$ sed -Ef quotes.sed file
- param:
  name: Command
  type: String
  value: "/bin/echo"
- param:
  name: Args
  type: String
  value: "Hello World"
- param:
  name: Something
  type: EnvVar
  value: "PATH"

おすすめ記事