Мне просто нужно получить соответствие из регулярного выражения:
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
Выход должен быть только то, что было найдено внутри скобки.
Не думайте, что я могу использовать grep, потому что он соответствует всей строке.
Пожалуйста, дайте мне знать, как это сделать.
sed
обратными ссылками, чтобы сделать это?источник
Если вы хотите только то, что находится в скобках, вам нужно что-то, что поддерживает захват подстрок (именованные или нумерованные группы захвата). Я не думаю, что grep или egrep могут это сделать, perl и sed могут. Например, с помощью Perl:
Если в файле с именем foo есть строка, которая выглядит следующим образом:
И вы делаете:
Письмо возвращается. Это может быть не то, что вы хотите, хотя. Если вы сообщите нам, что вы пытаетесь сопоставить, вам может помочь помощь. $ 1 - это то, что было зафиксировано в первой скобке. $ 2 будет второй сет и т. Д.
источник
Поскольку вы пометили свой вопрос как bash в дополнение к shell , кроме grep есть еще одно решение :
Начиная с версии 3.0, Bash имеет собственный механизм регулярных выражений, использующий
=~
оператор, как и Perl.Теперь, учитывая следующий код:
bash
а не толькоsh
для того, чтобы получить все расширения.$BASH_REMATCH
даст всю строку в соответствии с целым регулярным выражением, так<Lane>8</Lane>
${BASH_REMATCH[1]}
даст часть, соответствующую 1-й группе, таким образом, только8
источник
>
символ для совершенно разных целей), как это было продемонстрировано программным обеспечением быстрого масштабирования SANSparallel . Конечно, оба формата чересстрочной развёрнуты без какого-либо выхода. Таким образом, невозможно добавить какую-то стандартную библиотеку XML. И я использую регулярное выражение Bash на этом этапе кода, потому что мне нужно только извлечь пару данных, и 2 регулярные выражения делают работу намного лучше для меня, чем написание специального анализатора для этого беспорядка. #LifeInBioinformaticsПредполагая, что файл содержит:
И вы хотите, чтобы символ (ы) между
>
и</
, вы можете использовать либо:grep
grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed
sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk
awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl
perl -nle 'print $1 if />(\w+)<\//' file
Все напечатает строку "xyz".
Если вы хотите захватить цифры этой строки:
grep
grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed
sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk
awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl
perl -nle 'print $1 if />([0-9]+)<\//' file
источник
echo 'Text-<here>1234</text>-ends' | sed -E 's|.*>([[:digit:]]+)<.*|\1|'
. В некоторых случаях (например,[0-9]
против[[:digit:]]
) они не помогают разборчивости, в других я думаю, что они делают (например,[ \t\n\r\f\v]
против[:space:]
).Это выполнит то, что вы просите, но я не думаю, что это то, чего вы действительно хотите. Я поставил
.*
перед регулярным выражением, чтобы съесть что-нибудь перед матчем, но это жадная операция, так что это соответствует только предпоследнему\w
символу в строке.Обратите внимание, что вам нужно избежать Parens и
+
.источник