Bash Regex несколько дополнительных захватов

1

Я пытаюсь получить информацию из плагинов Wordpress, имя плагина и версию.

Я нахожу, что строка, которую я ищу, может быть Plugin Name: Plugin Name: Plugin Name: или * Plugin Name: или варианты пространства. Поскольку строка, которую я ищу, находится в части комментариев, она также может включать в себя *

Думаю, я дошел до того, что получил пробел, но я не могу понять, как захватить * пространство вокруг него.

grep "^\s*Plugin Name:" $files

который работает для большинства плагинов, но не для всех, так как у некоторых есть другие персонажи, которых нужно следить.

я пробовал

(\s*)?|( \* )?  
[ *]|[ \* ]? 
( *| \* )?

но я с трудом переворачиваю свою голову, наматывая все это вместе.

Изменение: использование

grep -E '^\s*\*?\s*Plugin Name:' $files

найдет все, но теперь два плагина в этом случае, имеющие * Plugin Name: будут распечатывать совершенно другой каталог в дополнение к правильной информации.

$ plugPath - это папка плагинов wordpress -/wp-content/plugins

folders='find $plugPath -maxdepth 1 -type d'
for plugin_folder in $folders
do
    echo $plugin_folder
    files='find $plugin_folder -maxdepth 1 -name "*.php"'

    n='grep -hE '^\s*\*?\s*Plugin Name:' $files'
    v='grep -hE '^\s*\*?\s*Version:' $files'
    echo " -- "$n
    echo " -- "$v
done

Результат, которого я ожидаю:

/home/test/accounts/account-one/public_html/wp-content/plugins/flexible-recent-posts
 -- Plugin Name: Flexible Recent Posts
 -- Version: 1.0.4

Пример, который работает:

Plugin Name: Flexible Recent Posts
Plugin URI: http://steelrat.info/
Description: Displays recent posts using flexible template system.
Version: 1.0.4
Author: SteelRat

Где это прикручивается:

/home/test/accounts/account-one/public_html/wp-content/plugins/portfolio-post-type
 --  2015.11.13-AccountInfo.log.csv accounts bin Desktop Documents Downloads latest.tar.gz Music Pictures Public Templates test-info.log.csv Videos wordpress Plugin Name: Portfolio Post Type
 --  2015.11.13-AccountInfo.log.csv accounts bin Desktop Documents Downloads latest.tar.gz Music Pictures Public Templates test-info.log.csv Videos wordpress Version: 0.9.1

Файл, в котором они находятся, выглядит так:

 * Plugin Name: Portfolio Post Type
 * Plugin URI:  http://wptheming.com/portfolio-post-type/
 * Description: Enables a portfolio post type and taxonomies.
 * Version:     0.9.1
  • 0
    Вы не можете просто использовать ^\s*\*\s*Plugin Name: Что в этом плохого?
  • 0
    Кстати, если ваш * должен быть заключен в пробел: ^\s*\( \* \)\?\s* .
Теги:

2 ответа

2
Лучший ответ

Просто:

grep "Plugin Name:"

недостаточно?

ОБНОВИТЬ

Затем попробуйте эту версию:

grep -E '^\s*[*]?\s*Plugin Name:'

Или эквивалент:

grep -E '^\s*\*?\s*Plugin Name:'

ОБНОВЛЕНИЕ 2

Вероятно, цикл в обновленном вопросе страдает синдромом неадекватно цитируемого файла. Я предлагаю найти однострочный интерфейс для получения практически одинаковой функциональности:

find "${WORDPRESS_PLUGIN_DIR}" -mindepth 2 -maxdepth 2 -iname "*.php" -exec grep -E '^\s*\*?\s*(Plugin Name|Version):' {} \;
  • 0
    потому что я получаю возвраты на некоторые плагины: активы имеют grunt Gruntfile.js info.txt languages _modd README.md rebrand.gif Имя плагина: Тип публикации портфолио
  • 0
    @ooklah: я понимаю, попробуйте обновленную версию регулярного выражения
Показать ещё 5 комментариев
0

Это ловит все, включая пробелы раньше, плюс одно пространство мимо Plugin Name:

grep -G "^.*Plugin Name:\s" $files

Ещё вопросы

Сообщество Overcoder
Наверх
Меню