Regex sed没有取代一切

Regex sed没有取代一切,regex,sed,Regex,Sed,我试图从数据文件中删除单引号后面/前面的所有空格。然而,我并没有抓住以下场景中的所有内容 输入 我正在运行sed命令 sed -i.bak 's/['\'' ]\{2\}/'\''/g' input.json 输出 {'_id':'BE3523','time':'18:20','number':'BE3523','destination':'Bordeaux','status':' Scheduled'} 请注意,”与计划的之间的空间仍然存在,但已删除了所有其他空间。我必须再次运行sed命令

我试图从数据文件中删除单引号后面/前面的所有空格。然而,我并没有抓住以下场景中的所有内容

输入

我正在运行sed命令

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

{'_id':'BE3523','time':'18:20','number':'BE3523','destination':'Bordeaux','status':' Scheduled'}
请注意,
”与计划的
之间的空间仍然存在,但已删除了所有其他空间。我必须再次运行sed命令,以清除下面的最后空间

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

你知道我做错了什么,为什么这个空格一直保留着吗?

你可以试着用一个引号来替换所有的例子,就像这样

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

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

其次,您的
sed
表达式所做的事情比您(可能)预期的要多(同时更少):它不仅将
(空格,引号)或
(引号,空格)替换为
'
(引号,引号)或
(空格,空格)替换为
。原因是您没有使用特定的序列(如另一个答案所建议的),或者在
之间使用异或(引号和空格)

要实现“压缩”效果(我猜是这样的):在单个引号之前或之后删除多个空格字符,可以使用以下方法:

sed "s/[[:space:]]*'[[:space:]]*/'/g" file
要仅剥离空间(不包括换行符/制表符):

在您的示例输入中,两者都将产生:

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

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

,“Scheduled
具有该字符类的3个字符,而不是2个。请注意,在结构化数据上使用regex通常是个坏主意。大多数情况下,最好先解析它,然后创建适当的输出。(例如,考虑在值中转义\'的情况)perl 5备选方案:
perl-i.bak-pe的/[]+(?='\'')|(?感谢LukStorms!搞定了,当时正盯着我看。将{2}更改为{2,3}.Davide你说得很对,虽然我从一个网站提取html生成这个JSON输入,作为概念验证的临时解决方案,同时我可以正确访问基础数据。因此,我在这个阶段仍在形成结构化数据,数据中永远不会有转义字符。售出!接受你的清除所有空格方法h、 谢谢。额外的空格把我弄得更糟了。JSON文件是我自己从HTML输入生成的,我只是对语法有点迟钝。它在我的待办事项列表中要修复。要使它成为有效的JSON(对于示例输入),你所要做的就是将
更改为
用于字符串值。然后,您将能够使用JSON解析器,从
jq
开始用于命令行使用。目前,我从这里将其直接放入MongoDB,然后在那里进行进一步修改。但将探索您提到的jq命令。与JSON不同,JavaScript(和MongoDB)接受带单引号的字符串。从技术上讲,你是对的,我以前也这么做过,但我一直在寻找一种稍微干净一点的方法。谢谢!
sed "s/ *' */'/g" file
{'_id':'BE3523','time':'18:20','number':'BE3523','destination':'Bordeaux','status':'Scheduled'}