2013-04-22 76 views
1

我已經寫了sed正則表達式(大多用的SO幫助下)以更新這可能是在形式的JSON文件中的值,桑達:什麼是錯的正則表達式

1 - "XXXX" : "YYYY"

2 - "XXXX" : "YYYY",

3 - "XXXX" : YYYY

4 - "XXXX" : YYYY,

5 - "XXXX" : "YYYY,ZZZZ"

這裏是我的正則表達式sed

sed -r 's/("XXXX"\s*:\s*)(")?[^",]*(")?/\1\2YYYY\3/'文件

上述表達式適用於1-4格式。

但5更新它像下面,

"XXXX" : "YYYY,ZZZZ""XXXX" : "ZZZZ,ZZZZ"(預期:"XXXX" : "ZZZZ"

這有什麼錯我的正則表達式?

謝謝!

+0

我不熟悉'sed'正則表達式,但是我的RE的一般goto資源是http://www.zytrax.com/tech/web/regex.htm編輯:選項(1-5)是你期望捕獲的項目嗎? – Izzy 2013-04-22 07:54:15

回答

1

既然你不擔心要更換不會更簡單的模式足夠

sed -r 's/("XXXX"\s*:\s*).*$/\1"YYYY",/' input 

或者,您可以分別對待的報價,不帶引號的那些價值

sed -r 's/("XXXX"\s*:\s*)((")[^"]*"|[^,]*)/\1\3YYYY\3/' input 
+0

感謝您的解決方案,我試過了,但更新後的值缺少開始報價, 'sed -r's /(「XXXX」\ s *:\ s *)((「)[^」] *「| [^ ,] *)/ \ 1 \ AAA \ 3 /」 sedtest 「XXXX」:AAA 「 」XXXX「:AAA」, 「XXXX」:AAA 「XXXX」:AAA, 「XXXX」 :AAA「' – bram 2013-04-22 09:10:36

+0

@indiws謝謝。在開始時錯過了添加'\ 3'引用。更新了答案 – shyam 2013-04-22 09:49:02

1

?指0或1。您使用(")?捕獲可選報價。相反,在這種情況下,因爲身體部分[^",]*無法比擬的YYYY,ZZZZ身體和尾部報價不匹配(此時被允許:零體由於*和零報價由於?),所以你只替代工作在該行的第一部分"XXXX" : ",其餘部分不被替換。

一個想法是+更換車身*需要一個身體。您可能還想將表達式與^$綁定,以便您知道您匹配整條線以避免這樣的混淆。

+0

感謝您的解釋。 – bram 2013-04-22 08:10:54

1

這可能會做你想要什麼:

sed -r 's/("XXXX"\s*:\s*)(")?[^",]*[^"]*/\1\2YYYY/' input 

不過,我不知道爲什麼玉期待"XXXX" : "ZZZZ"最後一個,因爲在你的替換字符串中沒有ZZZZ

+0

我希望即使有逗號分隔值,如「XXXX」:「YYYY,ZZZZ」,它應該更新爲單個值「XXXX」:「ZZZZ」 – bram 2013-04-22 08:08:18

+0

感謝您的解決方案。但在第四種情況下,它不會保留逗號。 – bram 2013-04-22 09:04:03