如何有条件地删除字符并保留两者之间的文本?

时间:2019-05-07 22:48:17

标签: regex sed

仅当我们遇到"codeBlock":{"_id":{"varying24characters"}时,才能使用sed或另一个POSIX命令删除括号。该行中可能存在多个与此条件匹配的匹配项,我想避免删除类似于smoreBlock的东西上的括号。

输入(一行)

test,"codeBlock":{"_id":{"4c9d4e1fe2c101000138eb4b"},morestuff,"smoreBlock":{"_id":{"6c9d4e1fe2c101000138eb4b"},hey,stuff,test,"codeBlock":{"_id":{"7c9d4e1fe7c101111138eb4b"},otherstuff

所需的输出

test,"codeBlock":{"_id":"4c9d4e1fe2c101000138eb4b",morestuff,"smoreBlock":{"_id":{"6c9d4e1fe2c101000138eb4b"},hey,stuff,test,"codeBlock":{"_id":"7c9d4e1fe7c101111138eb4b",otherstuff

我一直在猛烈阅读有关sed反向引用的信息,甚至无法接近我想要的东西。不幸的是,这不是家庭作业。我可以编写一个小程序来通过它进行暴力破解,但是我知道sed,awk或perl必须有一种方法来处理此问题。计划在RHEL7或CENTOS7主机上运行它。

1 个答案:

答案 0 :(得分:1)

换一种方式,将需要和不需要的都匹配在一起,但是将前者保留在捕获组中。因此,您可以只用所需的部分替换整个匹配项。

sed 's/\("codeBlock":{"_id":\){\("[0-9a-f]\{24\}"\)}/\1\2/g' file

或者,如果您有GNU sed:

sed -E 's/("codeBlock":\{"_id":)\{("[0-9a-f]{24}")\}/\1\2/g' file

两者都是

test,"codeBlock":{"_id":"4c9d4e1fe2c101000138eb4b",morestuff,"smoreBlock":{"_id":{"6c9d4e1fe2c101000138eb4b"},hey,stuff,test,"codeBlock":{"_id":"7c9d4e1fe7c101111138eb4b",otherstuff