Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何有条件地删除字符并保留中间的文本?_Regex_Sed - Fatal编程技术网

Regex 如何有条件地删除字符并保留中间的文本?

Regex 如何有条件地删除字符并保留中间的文本?,regex,sed,Regex,Sed,如何使用sed或其他POSIX命令删除大括号,但仅当我们遇到“codeBlock”:{“\u id”:{“varying24characters”}时才可以。行中可能有多个与此条件匹配的项,我希望避免删除类似于smoreBlock的项上的大括号 输入(单行) 期望输出 test,"codeBlock":{"_id":"4c9d4e1fe2c101000138eb4b",morestuff,"smoreBlock":{"_id":{"6c9d4e1fe2c101000138eb4b"},hey,s

如何使用sed或其他POSIX命令删除大括号,但仅当我们遇到
“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