web-dev-qa-db-ja.com

sedを使用して選択的に文字列を引用符に置き換える

ファイルがあります。

$ cat file
"bar":  false
"foo":  false

パターン"foo": falseでのみ、Word falsetrueに置き換える必要があります。問題は引用符とスペースです。

私は2つの方法について考えました:

  1. ある種のqoutes/double quotesでパターン全体を分離する。
  2. その前に「foo」がある「false」のみを置き換える。

2オプションの試用例:

$ sed -i 's/\(.*foo\)/false/true\1/g' file

失敗しました。

3
Josef Klimuk

住所を使用します。 sed式を単一引用符で囲む場合、引用符は問題になりません。

$ sed '/"foo"/ s/false/true/' file
"bar":  false
"foo":  true

パターン全体を本当に一致させる必要がある場合は、次のようにします。

$ sed '/"foo": *false/ s/false/true/' file
"bar":  false
"foo":  true

*は、任意の数の先行文字(スペース)と一致します。

\sを使用して、タブ(任意の水平方向の空白)も一致させることができます。

sed '/"foo":\s*false/ s/false/true/' file

テスト後に-iオプションを追加して、元のファイルを変更します。

8
Zanna