Я пытаюсь использовать grep для извлечения атрибутов из большой коллекции файлов XML. Я пытался использовать grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml || printf "NULL" но по какой-то причине он не возвращает NULL для файла, если регулярное выражение не совпадает. Конечная цель здесь - создать элементарную базу данных SQL из этих файлов, используя информацию из тегов для заполнения столбцов. Это мой первый набег на БД, так что, может быть, я ошибаюсь?
2 ответа
Если вам нужно что-то для файла, вы должны будете использовать grep для файла, что-то вроде:
$ find /home/somepath -type f -name '*.xml' | \
> while read path; do \
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
> done
Разбивая это:
$ find /home/somepath -type f -name '*.xml' -print | \
Это генерирует список файлов для поиска и передает их в то while . Единственное, что нужно сделать, это напечатать один путь на строку, поэтому есть много способов сделать это.
> while read path;do \
Это читает каждую строку в переменную оболочки path и выполняет цикл, пока read возвращает false , что происходит при достижении конца файла, что происходит, когда find генерирует все пути, по которым он собирается.
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
Это ищет текущий файл (в $path). Если шаблон не найден в файле, grep возвращает false (т. Е. Завершает работу с ненулевым кодом выхода), поэтому выполняется echo . -e говорит, что нужно интерпретировать escape-символы, поэтому echo напечатает текущий путь, ASCII- nul и литеральный NULL . Это для эмуляции вывода grep , который будет текущим путем (принудительно -H , поскольку grep обычно не выводит путь при поиске в одном файле), nul ASCII (из-за -Z) и сопоставляемым текстом ,
> done
Закрытие вне цикла.
Попробуйте так:
grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml 2>&- || echo "NULL"
