Нахождение текста между двумя определенными символами или строками

Принятие этого не является NFSv4, Вы по-видимому делаете анонимную долю, и потому что нет никакого соответствия uid/gid по умолчанию nobody/nogroup, присвоены.

17
08.03.2012, 01:29
4 ответа

Если у Вас есть GNU grep, можно использовать -o опция искать regex и произвести только часть соответствия. (Другие grep реализации могут только показать целую строку.), Если существует несколько соответствий на одной строке, они печатаются на отдельных строках.

grep -o '\[[0-9]*\]'

Если Вы только хотите цифры а не скобки, это немного более твердо; необходимо использовать утверждение нулевой ширины: regexp, который соответствует пустой строке, но только если этому предшествуют или сопровождают в зависимости от обстоятельств скобкой. Утверждения нулевой ширины только доступны в синтаксисе Perl.

grep -P -o '(?<=\[)[0-9]*(?=\])'

С sed необходимо выключить печать с -n, и соответствуйте целой строке и сохраните только часть соответствия. Если существует несколько возможных соответствий на одной строке, только последнее соответствие печатается. Посмотрите Извлечение regex, соответствовавшего 'sed', не печатая окружающие символы для получения дополнительной информации об использовании sed здесь.

sed -n 's/^.*\(\[[0-9]*\]\).*/\1/p'

или если Вы только хотите цифры а не скобки:

sed -n 's/^.*\[\([0-9]*\)\].*/\1/p'

Без grep -o, Perl является предпочтительным инструментом здесь, если Вы хотите что-то, что это и просто и понятно. На каждой строке (-n), если строка содержит достойный \[[0-9]*\], затем печать то соответствие ($&) и новая строка (-l).

perl -l -ne '/\[[0-9]*\]/ and print $&'

Если Вы только хотите цифры, помещаете круглые скобки в regex, чтобы разграничить группу и распечатать только ту группу.

perl -l -ne '/\[([0-9]*)\]/ and print $1'

P.S. Если Вы только хотите потребовать одной или нескольких цифр между скобками, изменением [0-9]* кому: [0-9][0-9]*, или к [0-9]+ в Perl.

16
27.01.2020, 19:47
  • 1
    Вся польза, кроме которой он хочет "извлечь число между скобками". Я думаю "кроме [number]"средства кроме [0-9] –  Peter.O 08.03.2012, 02:06
  • 2
    @Peter. O я понял “кроме [числа]”, чтобы означать, что нет других частей строки той формы. Но я отредактировал свой ответ, чтобы показать, как распечатать только цифры на всякий случай. –  Gilles 'SO- stop being evil' 08.03.2012, 02:39
  • 3
    Они perl regex утверждает действительно полезный взгляд! Я читал о них после наблюдения, что Вы используете и назад и передаете утверждения, даже в grep (я выключил к факт, можно выбрать regex механизм). Я буду посвящать немного больше времени regex perl отсюда на.Спасибо... PS.. Я просто читал в man grep... "Это очень экспериментально, и grep-P может предупредить о нереализованных функциях".... Я надеюсь, что это не означает нестабильный (?)... –  Peter.O 08.03.2012, 08:16

Вы не можете сделать этого с cut.

  1. tr -c -d '0123456789\012'
  2. sed 's/[^0-9]*//g'
  3. awk -F'[^0-9]+' '{ print $1$2$3 }'
  4. grep -o -E '[0-9]+'

tr самое естественное пригодное для проблемы и вероятно выполнило бы самое быстрое, но я думаю, что Вам были бы нужны гигантские исходные данные для разделения любой из этих опций с точки зрения скорости.

5
27.01.2020, 19:47
  • 1
    Для sed, ^.* является жадным и использует все кроме последней цифры, и + потребности быть \+ или иначе используйте posix \([0-9][0-9]*\).... и в любом случае 's/[^0-9]*//g' работы точно также, ... Thanks for the TR-c' пример, но не то запаздывание \012 surperfluous? –  Peter.O 08.03.2012, 02:48
  • 2
    @Peter спасибо за ловлю этого. Я поклялся бы, что протестировал sed пример.:( Я изменил его на Вашу версию. Относительно \012: это необходимо иначе tr съест новые строки. у группы –  Kyle Jones 08.03.2012, 02:58
  • 3
    Ага... Я видел его как \0, 1, 2 (или даже \, 0, 1, 2). Я достаточно хорошо не настраиваюсь к восьмеричному, которым это кажется..Спасибо. –  Peter.O 08.03.2012, 08:48

Если Вы имеете в виду извлечение ряд последовательных цифр между символами нецифры, я предполагаю sed и awk являются лучшими (хотя grep также может дать Вам подобранные символы):

sed: можно, конечно, соответствовать цифрам, но, возможно, интересно сделать противоположное, удалить нецифры (работы насколько существует только одно число на строку):

$ echo nn3334nn | sed -e 's/[^[[:digit:]]]*//g'
3344

grep: можно соответствовать последовательным цифрам

$ echo nn3334nn | grep -o '[[:digit:]]*'
3344

Я не даю пример для awk потому что у меня есть пустой опыт с ним; интересно отметить это, хотя sed швейцарский нож, grep дает Вам более простое, больше читаемого способа сделать это, которое также работает больше чем на одно число на каждой входной строке ( -o только печатает части соответствия входа, каждого на его собственной строке):

$ echo dna42dna54dna | grep -o '[[:digit:]]*'
42
54
4
27.01.2020, 19:47
  • 1
    Так же, как сравнение вот a sed eqivalent "больше чем одного числа на строку" пример grep -o '[[:digit:]]*' . . . sed -nr '/[0-9]/{ s/^[^[0-9]*|[^0-9]*$//g; s/[^0-9]+/\n/g; p}' ... (+1) –  Peter.O 07.03.2012, 23:10

Так как было сказано, что это не может быть, покончили cut, Я покажу, что легко возможно произвести решение, которое, по крайней мере, не хуже, чем некоторые из других, даже при том, что я не подтверждаю использование cut как "лучшее" (или даже особенно хорошее) решение. Нужно сказать что любое решение, не ищущее именно *[ и ]* вокруг цифр делает упрощение предположений и поэтому подвержен отказу на примерах, более сложных, чем затем один данный автором вопроса (например, цифры снаружи *[ и ]*, который нельзя показать). Это решение проверяет, по крайней мере, на скобки, и оно могло быть расширено для проверки звездочек также (оставленный как осуществление читателю):

cut -f 2 -d '[' myfile.txt | cut -f 1 -d ']'

Это использует -d опция, которая указывает разделитель. Очевидно, Вы могли также передать по каналу в cut выражение вместо того, чтобы читать из файла. В то время как cut вероятно, довольно быстро, так как это просто (никакой regex механизм), необходимо вызвать его по крайней мере дважды (или еще некоторые время для проверки на *), который создает некоторый процесс наверху. Одно реальное преимущество этого решения состоит в том, что это довольно читаемо, специально для обычных пользователей, не хорошо сведущих в конструкциях regex.

2
27.01.2020, 19:47

Теги

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