Сценарий Unix, который будет рекурсивно искать определенные имена

Предположим, вы хотите получить значение узлов playlist_urlдля каждого узла channel, у которого есть узел protectedсо значением True:

.
$ xmlstarlet sel -t -v '//channel[protected = "True"]/playlist_url' -nl file.xml
http://host.net/aa/vodpr/
http://host.net/aa/vodpr/con_tv_r.php

Используется xmlstarletдля применения запроса XPATH к документу. -nlв конце добавляет завершающую новую строку к последнему фрагменту данных.


Чтобы выбрать URL-адрес, соответствующий определенному тексту в узле title(, например, «содержит text 3» ), используйте

$ xmlstarlet sel -t -v '//channel[./title[contains(., "text 3")]]/playlist_url' -nl file.xml
http://host.net/aa/vodpr/

Здесь мы обнаруживаем текст text 3в значении узла titleи выбираем этот конкретный узел channel. Затем мы выбираем из него playlist_url.

-1
12.05.2020, 12:55
1 ответ

Команда, которая будет искать имена в текущем каталоге или ниже, которые содержат слова back(, которые включают backup), или которые содержат не менее 6 последовательных цифр, и печатает их пути.

find. \( -name '*back*' -o -name '*[0-9][0-9][0-9][0-9][0-9][0-9]*' \) -print

Чтобы что-то сделать с этими файлами или каталогами, сделайте это с помощью -execизfind:

find. \( -name '*back*' -o -name '*[0-9][0-9][0-9][0-9][0-9][0-9]*' \) -exec sh -c '
    for pathname do
        # code that uses "$pathname"
    done' sh {} +

Если вы хотите, чтобы имена содержали шесть цифр в любом месте , а не последовательно, измените шаблон *[0-9][0-9][0-9][0-9][0-9][0-9]*на *[0-9]*[0-9]*[0-9]*[0-9]*[0-9]*[0-9]*.

См. также:

4
28.04.2021, 23:14

Теги

Похожие вопросы