Принятие этого не является NFSv4, Вы по-видимому делаете анонимную долю, и потому что нет никакого соответствия uid/gid по умолчанию nobody/nogroup, присвоены.
Если у Вас есть 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.
Вы не можете сделать этого с cut
.
tr -c -d '0123456789\012'
sed 's/[^0-9]*//g'
awk -F'[^0-9]+' '{ print $1$2$3 }'
grep -o -E '[0-9]+'
tr
самое естественное пригодное для проблемы и вероятно выполнило бы самое быстрое, но я думаю, что Вам были бы нужны гигантские исходные данные для разделения любой из этих опций с точки зрения скорости.
^.*
является жадным и использует все кроме последней цифры, и +
потребности быть \+
или иначе используйте posix \([0-9][0-9]*\)
.... и в любом случае 's/[^0-9]*//g'
работы точно также, ... Thanks for the
TR-c' пример, но не то запаздывание \012
surperfluous?
– Peter.O
08.03.2012, 02:48
\012
: это необходимо иначе tr
съест новые строки. у группы
– Kyle Jones
08.03.2012, 02:58
\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
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.
[number]
"средства кроме[0-9]
– Peter.O 08.03.2012, 02:06perl
regex утверждает действительно полезный взгляд! Я читал о них после наблюдения, что Вы используете и назад и передаете утверждения, даже в grep (я выключил к факт, можно выбрать regex механизм). Я буду посвящать немного больше времени regex perl отсюда на.Спасибо... PS.. Я просто читал вman grep
... "Это очень экспериментально, и grep-P может предупредить о нереализованных функциях".... Я надеюсь, что это не означает нестабильный (?)... – Peter.O 08.03.2012, 08:16