Почти все команды позволяют --
как разделитель между параметрами опций и позиционными параметрами. Можно использовать следующее:
cat -- -w
rm -f -- -w
$> echo "random junk foo=12345 more junk random junk foo=2345 junk foo=7654 junk random foo=5432 junk" | grep --only-matching --perl-regexp "(?<=foo=)[0-9]+"
12345
2345
7654
5432
Что мы сделали, вот использование lookbehind regex в "(?<=foo=)[0-9]+"
.
Я использовал бы awk
проанализировать длинную линию в записи.
awk 'BEGIN{FS="=";RS=" "}/^foo=/{print $2}'
Это устанавливает каждое "слово" как отдельную запись, и в том слове, для разделения полей с '='. Затем просто произведите правую сторону '=', когда левая сторона будет "нечто". Должен использовать regexp вместо $1=="foo"
с тех пор, если существует не '=', первое поле совпадает со всей записью.
Можно сделать это с одними только конструкциями оболочки: считайте данные в переменную, затем разделите эту переменную в символах в $IFS
(пробел по умолчанию), и сохраняют блоки, которые Вы хотите. Подстановка переменных вне двойных кавычек подвергается разделению слова (который мы хотим здесь) и поколение имени файла (иначе globbing, который мы не хотим), поэтому выключите globbing с set +f
сначала.
set +f
for x in $(cat /path/to/file); do
case "$x" in
foo=*) echo "${x#*=}";;
esac
done
set -f
Вместо вызова cat
, можно использовать read
встроенный.
set +f
read -r line </path/to/file
for x in $line; do …
--perl-regexp
опция доступна версиям GNUgrep
. Системы не-Linux не могут принять значение по умолчанию к версии GNU. – Arcege 26.02.2012, 22:19foo=\K[0-9]+
, который может быть "значительно более эффективным". – camh 26.02.2012, 22:21