У меня небольшие проблемы с bash/sed. Мне нужно иметь возможность использовать подстановку команд в выражении sed. У меня есть два больших текстовых файла:
во-первых, это файл logfile.txt, который иногда* показывает сообщения об ошибках по идентификатору (0xdeadbeef — распространенный пример) в формате ERRORID:0xdeadbeef.
во втором файле errors.txt сообщения об ошибках хранятся парами LONG_ERROR_DESCRIPTION, 0xdeadbeef
Я пытался использовать 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"
errors.txt
не совсем подходит для машинной обработки. Что-то вроде0xdeadbeef Long description
будет легче обрабатывать. Может быть, вы захотите сгенерировать из него кучу#define
в другой прекрасный день? - person tripleee   schedule 06.10.2011