У меня небольшая проблема с bash / sed. Мне нужно иметь возможность использовать подстановку команд в выражении sed. У меня есть два больших текстовых файла:
первым является logfile.txt, который иногда * показывает сообщения об ошибках по идентификатору (0xdeadbeef - типичный пример) в формате ERRORID: 0xdeadbeef
second errors.txt содержит сообщения об ошибках, хранящиеся в парах
Я пытался использовать sed с подстановкой команд bash для выполнения задачи:
cat logfile.txt | sed "s/ERRORID:\(0x[0-9a-f]*\)/ERROR:$(cat errors.txt |
grep \1 | grep -o '^[A-Z_]*' )/g"
(^^^ это должно быть в одной строке, конечно)
Если бы это сработало, то я мог бы получить немного более приятную версию файла журнала с лучшей информацией об ошибках.
Lot's of meaningless stuff ERRORID:0xdeadbeef and something else =>
=> Lot's of meaningless stuff ERROR:LONG_ERROR_DESCRIPTION and something else
Но это не так. Проблема в том, что sed не может «вставить» секцию регулярных выражений (\ 1) в подстановку команд. Какие у меня есть другие варианты? Я знаю, что сначала можно создать sed-выражение или сделать это другим способом, но я бы не хотел разбирать эти файлы несколько раз (они могут быть огромными).
Как всегда большое спасибо за любую помощь.
* в журнале нет реального форматирования. Разделы, столбцы, табуляция / разделение запятой используются непоследовательно
PS. Просто чтобы объяснить. Следующее выражение работает, но, конечно, в нем нет аргументов, передаваемых:
echo "my cute cat" | sed "s/cat/$(echo dog)/g"