不取代一切

时间:2017-08-13 19:41:45

标签: regex 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'}

任何想法,我做错了,为什么这个空间一直存在?

2 个答案:

答案 0 :(得分:2)

首先,您的输入文件input.json不是有效的JSON,因为字符串使用单引号而不是双引号。

其次,你的sed表达式比你(可能)期望的更多(同时更少):它不仅会替换'(空格,引用)或{{1} (引用,空格)''(引用,引用)或''(空格,空格)。原因是你没有使用特定的序列(如其他答案所提议的),或者是''(引用和空格)之间的排他性。

要实现“压缩”效果,我猜测你要去:在单引号之后删除之前的多个空格字符,你可以使用:

仅剥离空格(不包括换行符/制表符):

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

在您的样本输入上,两者都会产生:

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

我不确定为什么要通过这种方式剥离前导/尾随空格来修改值。

答案 1 :(得分:1)

您可以尝试使用单引号替换所有案例,例如

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