Проблемы при написании команды bash sed - регулярное выражение - PullRequest
0 голосов
/ 28 августа 2018

У меня есть файл, полный информации о сборке мусора, который является нерегулярным, некоторые строки содержат дополнительную информацию, которую я хочу первоначально удалить, чтобы я мог затем обработать файл в целом.

К сожалению, в строке довольно много специальных символов, и я борюсь с командой sed, которой удается сопоставить бит, который я хочу удалить ...

Строка включает в себя что-то вроде этого:

[ParOldGen: 0K->0K(0K)] 0K->0K(0K), [Metaspace: 0K->0K(0K)], 0 secs]

В этой строке есть другая информация, которую я хочу сохранить, которая включает в себя []() символов.

Я хочу соответствовать

[ParOldGen*secs]

и затем удалите его с помощью sed

cat test.log | sed -e 's,<match>,,g' | ...

Я пошел и проверил проверку на регулярные выражения, которая придумала:

\[ParOldGen(?:(?!secs\])(?:.|\n))*secs\]

Однако он не совпадает с sed -e и выдает ошибку при использовании sed -E

Я не могу легко использовать вырезку, потому что в слишком многих других разделах есть [и].

Я пытался что-то вроде этого:

cat test.log | while read line; do if [ "$line" == *"ParOldGen"* ];then cut -d ":" -f 1,9; else cut -d ":" -f 1,7; fi; done | tail

, что эффективно обойти это, но я не смог найти совпадение в ParOldGen, он всегда просто выполняет часть then.

Мой ожидаемый вывод - я хочу удалить строку ParOldGen.

Кто-нибудь может мне помочь с этим?

Спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Я работаю в предположении, что вы хотите удалить всю строку, начиная с [ParOldGen и заканчивая secs] из каждой строки в вашем файле. В этом случае вы можете использовать следующую команду sed:

sed -e 's/^\(.*\)\[ParOldGen.*secs\]\(.*\)$/\1\2/' test.log

Регулярное выражение захватывает любые символы до [ParOldGen в одну группу захвата, а любые символы после secs] - в другую. Затем вся строка заменяется этими двумя группами захвата, эффективно удаляя символы от [ParOldGen до secs]. например если test.log содержит:

[Some other data (4) ][ParOldGen: 0K->0K(0K)] 0K->0K(0K), [Metaspace: 0K->0K(0K)], 0 secs] and then some more [possibly also with ()]

Выход cat test.log | sed -e 's/^\(.*\)\[ParOldGen.*secs\]\(.*\)$/\1\2/' равен

[Some other data (4) ] and then some more [possibly also with ()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...