Я пытаюсь использовать 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"