仅当我们遇到"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主机上运行它。
答案 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