2016-04-01 12 views
5

Tôi chỉ định không gian địa chỉ giữa "{" và "}" trong sed, vì vậy tôi chỉ mong đợi "Acer" đầu tiên được thay thế thành "TTTT". Thứ hai là không mong đợi. Làm cách nào để khắc phục sự cố này? Tôi đã thử nghiệm trên Ubuntu 15.10 và phiên bản sed là sed (GNU sed) 4.2.2.không gian địa chỉ sed giữa "{" và "},"

Xin cảm ơn trước.

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

kết quả của nó là như sau:

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

Mẫu thứ hai trong địa chỉ có nghĩa là "dừng khi tìm thấy điều này". Nó không có nghĩa là "không tiến hành nếu điều này không được tìm thấy". –

Trả lời

1

này sẽ chỉ làm việc cho GNU sed

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

hay nói chính xác hơn sau cũng đang làm việc

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' 

tôi đã sử dụng v5.16.3 perl đây mà trả về như sau:

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

Lưu ý:

  • -0777 Slurp toàn bộ tập tin
  • loop -p qua đường dây và in chúng
  • -e code trong dòng lệnh
  • thay thế (s ///) trên toàn cầu (g) ​​và cho phép ký tự đại diện khớp với các ký tự dòng mới
Các vấn đề liên quan