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"