Есть ли способ сказать, sed
чтобы вывести только захваченные группы? Например, с учетом ввода:
This is a sample 123 text and some 987 numbers
и шаблон:
/([\d]+)/
Могу ли я получить только 123 и 987 вывод способом, отформатированным обратными ссылками?
sed
включить расширенные регулярные выражения с-E
флагом.Ответы:
Ключом к тому, чтобы заставить это работать, является
sed
указание исключить то, что вы не хотите выводить, а также указать, что вы хотите.Это говорит:
-n
)p
)В общем,
sed
вы захватываете группы, используя скобки, и выводите то, что вы захватываете, используя обратную ссылку:выведет "бар". Если вы используете
-r
(-E
для OS X) для расширенного регулярного выражения, вам не нужно экранировать скобки:Может быть до 9 групп захвата и их обратных ссылок. Обратные ссылки нумеруются в порядке появления групп, но их можно использовать в любом порядке и повторять:
выводит "бар а".
Если у вас есть GNU
grep
(он также может работать в BSD, включая OS X):или варианты, такие как:
-P
Опция позволяет Perl Compatible Regular Expressions. Смотритеman 3 pcrepattern
илиman 3 pcresyntax
.источник
sed
пример, если вы используете-r
опцию (или-E
для OS X, IIRC), вам не нужно избегать скобок. Разница заключается в том, что между базовыми регулярными выражениями и расширенными регулярными выражениями (-r
).Sed имеет до девяти запоминаемых шаблонов, но вам нужно использовать экранированные скобки, чтобы запомнить части регулярного выражения.
Смотрите здесь для примеров и более подробно
источник
sed -e 's/version=\(.+\)/\1/' input.txt
это все равно будет выводить весь input.txt\+
вместо+
. И я не понимаю, почему люди используют-e
только одну команду sed.sed -e -n 's/version=\(.+\)/\1/p' input.txt
см: mikeplate.com/2012/05/09/...sed -E
использовать так называемые «современные» или «расширенные» регулярные выражения, которые намного ближе к Perl / Java / JavaScript / Go / любым другим разновидностям. (Сравните сgrep -E
илиegrep
.) Синтаксис по умолчанию имеет те странные экранирующие правила и считается "устаревшим". Для получения дополнительной информации о различиях между ними, запуститеman 7 re_format
.вы можете использовать grep
источник
o
опция есть - unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, --only-Match Показать только часть совпадающей строки, которая соответствует PATTERNgrep -Eow -e "[0-9]+" -e "[abc]{2,3}"
я не знаю, как вы могли бы требовать, чтобы эти два выражения находились на одной строке, помимо конвейера из предыдущего grep (который все равно может не работать, если какой-либо шаблон соответствует более одного раза в строке ).пробег (ы) цифр
Этот ответ работает с любым количеством цифр групп. Пример:
Расширенный ответ.
Да. замените весь текст группой захвата:
Или с расширенным синтаксисом (меньше обратных кавычек и допускается использование +):
Чтобы избежать печати оригинального текста, когда номера нет, используйте:
И сопоставить несколько чисел (а также распечатать их):
Это работает для любого количества запусков цифр:
Что очень похоже на команду grep:
О \ d
Sed не распознает синтаксис «\ d» (ярлык). Используемый выше эквивалент ascii
[0-9]
не совсем эквивалентен. Единственное альтернативное решение - использовать класс символов: '[[: digit:]] `.Выбранный ответ использует такие «классы символов» для построения решения:
Это решение работает только для (точно) двух серий цифр.
Конечно, поскольку ответ выполняется внутри оболочки, мы можем определить пару переменных, чтобы сделать такой ответ короче:
Но, как уже было объяснено,
s/…/…/gp
лучше использовать команду:Это будет охватывать как повторные серии цифр, так и написание короткой (er) команды.
источник
Я полагаю, что шаблон, приведенный в вопросе, был только в качестве примера, и цель состояла в том, чтобы соответствовать любому шаблону.
Если у вас есть sed с расширением GNU, позволяющим вставлять новую строку в пространство шаблонов, одно из предложений:
Эти примеры с tcsh (да, я знаю, что это не та оболочка) с CYGWIN. (Правка: для bash удалите set и пробелы вокруг =.)
источник
+
, вам нужно его отключить или использовать-r
опцию (-E
для OS X). Вы также можете использовать\{1,\}
(-r
или-E
без побега).Сдайся и используй Perl
Так
sed
как не обрезает его, давайте просто выбросим полотенце и используем Perl, по крайней мере это LSB, аgrep
расширения GNU - нет :-)Напечатайте всю соответствующую часть, не требуя соответствующих групп или вида сзади:
Вывод:
Одно совпадение на строку, часто структурированные поля данных:
Вывод:
Сзади
Несколько полей:
Вывод:
Несколько совпадений в строке, часто неструктурированные данные:
Вывод:
Сзади
Вывод:
источник
Пытаться
Я получил это под Cygwin:
источник
Это не то, о чем просил ФП (захват групп), но вы можете извлечь числа, используя:
Дает следующее:
источник