Извлечение текста от текстового файла в ударе

Почти все команды позволяют -- как разделитель между параметрами опций и позиционными параметрами. Можно использовать следующее:

cat -- -w
rm -f -- -w
3
27.02.2012, 01:34
3 ответа
$> 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]+".

3
27.01.2020, 21:12
  • 1
    Обратите внимание что --perl-regexp опция доступна версиям GNU grep. Системы не-Linux не могут принять значение по умолчанию к версии GNU. –  Arcege 26.02.2012, 22:19
  • 2
    Согласно perlre странице справочника, можно также записать этот regex как foo=\K[0-9]+, который может быть "значительно более эффективным". –  camh 26.02.2012, 22:21
  • 3
    Здорово! Это работает отлично. Я нахожусь на OS X, btw. –  Roger Gilbrat 27.02.2012, 00:03

Я использовал бы awk проанализировать длинную линию в записи.

awk 'BEGIN{FS="=";RS=" "}/^foo=/{print $2}'

Это устанавливает каждое "слово" как отдельную запись, и в том слове, для разделения полей с '='. Затем просто произведите правую сторону '=', когда левая сторона будет "нечто". Должен использовать regexp вместо $1=="foo" с тех пор, если существует не '=', первое поле совпадает со всей записью.

4
27.01.2020, 21:12

Можно сделать это с одними только конструкциями оболочки: считайте данные в переменную, затем разделите эту переменную в символах в $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 …
1
27.01.2020, 21:12

Теги

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