1

Я пытаюсь использовать grep для извлечения атрибутов из большой коллекции файлов XML. Я пытался использовать grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml || printf "NULL" но по какой-то причине он не возвращает NULL для файла, если регулярное выражение не совпадает. Конечная цель здесь - создать элементарную базу данных SQL из этих файлов, используя информацию из тегов для заполнения столбцов. Это мой первый набег на БД, так что, может быть, я ошибаюсь?

2 ответа2

1

Если вам нужно что-то для файла, вы должны будете использовать 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

Закрытие вне цикла.

0

Попробуйте так:

grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml 2>&- || echo "NULL"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .