2017-08-13 165 views
1

我試圖從數據文件中刪除單引號之後的所有空格。不過,我並沒有捕捉到下面的情況。sed沒有替換所有的東西

輸入

{'_id':' BE3523 ', 'time':' 18:20 ', 'number':' BE3523 ', 'destination':' Bordeaux ', 'status': ' Scheduled '} 

sed命令我跑......

sed -i.bak 's/['\'' ]\{2\}/'\''/g' input.json 

輸出

{'_id':'BE3523','time':'18:20','number':'BE3523','destination':'Bordeaux','status':' Scheduled'} 

'_Scheduled遺蹟之間的空間,但其他空間有已被刪除。我必須再次運行sed命令來擺脫這個最後空間,下面的是

{'_id':'BE3523','time':'18:20','number':'BE3523','destination':'Bordeaux','status':'Scheduled'} 

任何想法,我做錯了,爲什麼這樣一個空間始終保持?

+4

','計劃的'有3個字符的那個字符類,而不是2. – LukStorms

+2

請注意,對結構化數據使用正則表達式通常是一個壞主意。大多數情況下最好解析它,然後創建適當的輸出。 (例如,考慮\'在值內跳轉的情況)例如: –

+0

perl 5 perl:'perl -i.bak -pe's/[] +(?='\'')|(?<=' \'')[] + // g'input.json' – LukStorms

回答

2

首先,輸入文件,input.json,不是一個有效的JSON,因爲字符串使用單引號,而不是雙引號。

其次,你sed表達做更多的比你(也許)希望(並在同一時間以內):它將取代不僅'(空格,引號)或'(報價,空間)與',也''(報價,報價)或(空間,空間)與'。原因是你沒有使用特定的順序(如其他答案所建議的),或者是獨佔的或在'(引用和空格)之間。

要實現「壓縮」的效果,這(我猜)你會爲:單引號後之前刪除多個空格字符,你可以這樣做:

sed "s/[[:space:]]*'[[:space:]]*/'/g" file 

剝離只有空間(不包括換行/選項卡):

sed "s/ *' */'/g" file 

在您的樣品輸入,既會產生:

{'_id':'BE3523','time':'18:20','number':'BE3523','destination':'Bordeaux','status':'Scheduled'} 

我不確定你爲什麼想要通過這種方法去除前導/尾隨空格來修改值。

+0

已售出!採取你清楚的所有空間方法,謝謝。多餘的空間讓我更下游。 JSON文件是我自己從HTML輸入的一代,我只是對語法很懶。這是我的工作清單來解決。 – NickS

+0

爲了使其成爲有效的JSON(對於示例輸入),您只需將字符串值更改爲'''',然後就可以使用JSON解析器,以'jq'開頭 – randomir

+0

目前我從這裏直接進入MongoDB,然後在那裏做進一步的修改,但會探索你提到的jq命令 – NickS

1

你可以嘗試用單引號替換所有的情況下,像這樣

sed -i.bak "s/\(' \|' \| '\)/'/g" input.json 
+1

從技術上講,你是對的,我之前就是這麼做的,但我一直在尋找一種更清潔的方法。謝謝! – NickS