2017-08-13 126 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