Regex 如何有条件地删除字符并保留中间的文本?
如何使用sed或其他POSIX命令删除大括号,但仅当我们遇到Regex 如何有条件地删除字符并保留中间的文本?,regex,sed,Regex,Sed,如何使用sed或其他POSIX命令删除大括号,但仅当我们遇到“codeBlock”:{“\u id”:{“varying24characters”}时才可以。行中可能有多个与此条件匹配的项,我希望避免删除类似于smoreBlock的项上的大括号 输入(单行) 期望输出 test,"codeBlock":{"_id":"4c9d4e1fe2c101000138eb4b",morestuff,"smoreBlock":{"_id":{"6c9d4e1fe2c101000138eb4b"},hey,s
“codeBlock”:{“\u id”:{“varying24characters”}
时才可以。行中可能有多个与此条件匹配的项,我希望避免删除类似于smoreBlock的项上的大括号
输入(单行)
期望输出
test,"codeBlock":{"_id":"4c9d4e1fe2c101000138eb4b",morestuff,"smoreBlock":{"_id":{"6c9d4e1fe2c101000138eb4b"},hey,stuff,test,"codeBlock":{"_id":"7c9d4e1fe7c101111138eb4b",otherstuff
我一直在读有关sed反向引用的文章,甚至无法接近我要查找的内容。不幸的是,这不是家庭作业。我可以编写一个小程序来强行通过它,但我知道必须有一种方法让sed、awk或perl来处理这一问题。计划在RHEL7或CENTOS7主机上运行它。想想看吧另一种方法是,将需要的和不需要的匹配在一起,但将前者保留在捕获组中。这样,您就可以用只需要的部分替换整个匹配
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”:{“\u id”:“4c9d4e1fe2c101000138eb4b”,morestuff,“smoreBlock”:{“\u id”:{“6C9D4E1FE2C10100013EB4B”},嘿,stuff,test,“codeBlock”:{“\u id”:“7C9D4E1FE7C1011111138EB4B”,其他东西
两种解决方案都能工作并产生相同的结果。这既简单又优雅,而且最重要的是它实际上是有意义的!很好地抓住了a-f与a-z的对比。
sed -E 's/("codeBlock":\{"_id":)\{("[0-9a-f]{24}")\}/\1\2/g' file