Bash извлечь строку с помощью grep - PullRequest
0 голосов
/ 07 апреля 2020

Допустим, у меня есть несколько строк в одном файле, и я хочу извлечь только указанную c строку

$plugin->component = 'mod_jitsi';
$plugin->component = 'local_hvp';
$plugin->component = 'test_bot';
$plugin->component = 'mod_bot';
$plugin->component = 'mod_moodle';

Я хочу отфильтровать это с помощью grep, чтобы мои выходные данные выглядели так:

mod
local
test
mod
mod

Есть ли способ сделать это с помощью grep или мне нужно использовать awk или sed?

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 08 апреля 2020
echo '$plugin->component = 'mod_jitsi';
$plugin->component = 'local_hvp';
$plugin->component = 'test_bot';
$plugin->component = 'mod_bot';
$plugin->component = 'mod_moodle';' > STRING

awk 'BEGIN { FS ="=" } ; { print $2 }' STRING | cut -d "_" -f1



mod
local
test
mod
mod
1 голос
/ 07 апреля 2020

Использование регулярных выражений GNU grep и pcre:

grep -Po "(?<== ')[^_]*" input.txt

(?<== ') является положительным утверждением нулевой ширины с задним числом . Он не включен в сопоставленный текст, но он должен соответствовать = ' перед частью RE, которая включена (Это все, начиная с кавычки до первого подчеркивания.

0 голосов
/ 08 апреля 2020

PCRE - это, вероятно, лучший способ, и у вас уже есть два ответа, которые демонстрируют, как его использовать.

Однако существует более «элементарный» способ - использование только BRE (basi c регулярный выражения, используемые равниной grep). Вам просто нужно вызвать его дважды.

Я предполагаю, что каждая строка ввода имеет (не более) одну подстроку, состоящую из одинарных кавычек, за которыми следует ноль или несколько символов, не являющихся одинарными кавычками, не подчеркивания, а затем подчеркиванием, и вы должны извлечь последовательность символов, не заключенных в одинарные кавычки, не подчеркивания в этой подстроке.

Если входные строки находятся в файле my_file:

[mathguy@localhost ~/test]$ more my_file
$plugin->component = 'mod_jitsi';
$plugin->component = 'local_hvp';
$plugin->component = 'test_bot';
$plugin->component = 'mod_bot';
$plugin->component = 'mod_moodle';


[mathguy@localhost ~/test]$ grep -o "'[^'_]*_" my_file | grep -o "[^'_]*"
mod
local
test
mod
mod
0 голосов
/ 07 апреля 2020

Если ваш grep поддерживает Perl -совместимые регулярные выражения (PCRE):

grep -Po '\$plugin->component = '\''\K[^_]+' file

С sed:

sed -En 's/\$plugin->component = '\''([^_]+).*/\1/p' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...