Как условно удалить символы и сохранить текст между ними? - PullRequest
2 голосов
/ 08 мая 2019

Как можно использовать sed или другую команду POSIX для удаления скобок, но только когда мы встречаемся с "codeBlock":{"_id":{"varying24characters"}. Может быть несколько совпадений с этим условием в строке, и я хочу избежать удаления скобок на чем-то похожем на 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, awk или perl должен быть способ справиться с этим. Планирование выполнить это на хосте RHEL7 или CENTOS7.

1 Ответ

1 голос
/ 08 мая 2019

Думайте по-другому, сопоставляйте как необходимые, так и ненужные вместе, но оставляйте прежние в группах захвата. Таким образом, вы можете заменить весь матч только необходимыми деталями.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...