2016-04-01 3 views
5

sedの "{"と "}"の間のアドレススペースを指定していますので、最初の "Acer"だけを "TTTT"に置き換えてください。 2番目は期待されていません。この問題を解決するにはどうすればよいですか? 私はUbuntu 15.10でテストを行い、sedのバージョンはsed(GNU sed)4.2.2です。sed - "{"と "}"の間のアドレススペース

ありがとうございます。次のように

$ echo " 
[ 
    { 
     \"manufacturer\": \"Acer\", 
     \"regularPrice\": 165.99, 
    }, 
    [ 
     \"manufacturer\": \"Acer\", 
     \"regularPrice\": 165.99, 
    ], 
    { 
     \"manufacturer\": \"Acer\", 
     \"regularPrice\": 165.99, 
    } 
] 
" | sed "/{/,/},/ {s/\"Acer\"/\"TTTT\"/}" 

その結果

は以下のとおりです。

[ 
    { 
    "manufacturer": "TTTT", 
    "regularPrice": 165.99, 
    }, 
    [ 
    "manufacturer": "Acer", 
    "regularPrice": 165.99, 
    ], 
    { 
    "manufacturer": "TTTT", 
    "regularPrice": 165.99, 
    } 
] 
+1

アドレスの2番目のパターンは、「これが見つかったら停止」を意味します。それが「見つからなければ進まない」という意味ではありません。 –

答えて

1

これはGNU sed

sed "/{/,/},/ {0,/\"Acer\"/ s/\"Acer\"/\"TTTT\"/}" 

のためにのみ動作しますかより正確に、次のようにも取り組んでいる

sed "/{/,/},/ {0,/\"Acer\"/s//\"TTTT\"/}" 
1
echo ' 
[ 
    { 
     "manufacturer": "Acer", 
     "regularPrice": 165.99, 
    }, 
    [ 
     "manufacturer": "Acer", 
     "regularPrice": 165.99, 
    ], 
    { 
     "manufacturer": "Acer", 
     "regularPrice": 165.99, 
    } 
] 
' | perl -0777 -pe 's/({[^}]*)"Acer"([^{]*?},)/$1"TTTT"$2/gs' 

私は次のように返し、ここではPerl v5.16.3を使用:

[ 
    { 
     "manufacturer": "TTTT", 
     "regularPrice": 165.99, 
    }, 
    [ 
     "manufacturer": "Acer", 
     "regularPrice": 165.99, 
    ], 
    { 
     "manufacturer": "Acer", 
     "regularPrice": 165.99, 
    } 
] 

注:

  • -0777が
  • ラインオーバー-pループをファイル全体を読まと
  • それらを印刷しますコマンドラインの-eコード
  • グローバルに置換(s ///)し、ワイルドカードで改行文字を一致させる