2016-04-01 48 views
5

Specifico lo spazio degli indirizzi tra "{" e "}," in sed, quindi mi aspetto che il primo "Acer" sia sostituito in "TTTT". Il secondo non è previsto. Come posso risolvere questo problema? Ho fatto il test su Ubuntu 15.10 e la versione sed è sed (GNU sed) 4.2.2.sed - spazio indirizzo tra "{" e "},"

Grazie in anticipo.

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

I risultati sono i seguenti:

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

Il secondo motivo nell'indirizzo indica "ferma quando viene trovato". Non significa "non procedere se questo non viene trovato". –

risposta

1

Questo funziona solo per GNU sed

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

o per essere più precisi seguente sta lavorando

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' 

Ho usato v5.16.3 perl qui che restituisce il seguente:

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

Nota:

  • -0777 slurp l'intero file
  • ciclo -p su linee e stamparli
  • -e codice nella riga di comando
  • sostituzione (s ///) globalmente (g) e consentire ai caratteri jolly di corrispondere a caratteri di nuova riga