2013-07-10 111 views
1

我有一個部分損壞的JSON文件的數據庫。由於某種原因編寫這些文件的人在文件末尾添加了一個額外的逗號。有這些文件的無數,所以我需要修復它們。這是什麼樣子:sed命令與 n

{ 
"foo": "bar", 
"foo1": "bar1", 
"foo2": "bar2", 
} 

所以我想用sed命令擺脫逗號。現在,我有sed的|',\ n}'|'\ n}'|'但它不會修改文件。我究竟做錯了什麼?

+0

請格式化您的代碼,因此它更具可讀性。例如,在「sed ...」行而不是引號(或者在這種情況下是開頭引號)後面加上反引號 –

+0

您是否安裝了Perl?使用Perl比sed更容易 – DVK

回答

0

隨OS X附帶的sed版本不會將\n視爲換行符,而是將其視爲換行符'n'(將其縮減爲常規'n')。由於您使用bash,你可以嘗試以下方法:

sed $'s|,}|\\\n|' file.txt 

$'...'是一種特殊類型的bash引用的,允許特殊對待某些逃逸。 \\\n是一個轉義反斜槓,後跟一個換行符,作爲單個轉義換行符呈現給sed

更新:在記住在搜索文本中使用$而不是換行符後,我意識到你不能匹配後面一行中的後跟一個大括號的命令(或者至少,我不知道如何與我的有限命令sed)。

+0

搜索後,我發現這個:sed'N; s |,\ n} |} |'但現在它會刪除大括號而不是逗號。 – ThurnisH41ey

+1

正在運行sed $ | | \\\ n} | \\\ n} |' file.txt返回sed:1:「s |,\ } | \ } |」:未終止的替代模式 – ThurnisH41ey

+0

這給出:OSX 10.6.2上的「未終止的替代模式」 – anubhava

0

你可以試試AWK:

awk '{ if (/}/) sub(",$", "", last); if (last) print last; last=$0 } END { print last }' 
0

這是一個SED解決方案,在OSX上的作品,以及:

sed -e ':a' -e 'N; $!ba' -e 's/,\(\n}\)/\1/' file.json 

作爲替代你可以安裝GNU-SID上OSX使用:

sudo brew install gnu-sed 

然後運行:

gsed -e ':a; N; $!ba; s/,\(\n}\)/\1/' file.json