Получить следующее слово подстроки в строке

Я успешно выполняю несколько экземпляров OMXPlayer на Raspbian с помощью pyomxplayer библиотекой. См. код здесь: http://www.sundh.com/blog/2013/10/loop-videos-seamlessly-omxplayer/

2
28.08.2015, 15:27
5 ответов

Я предлагаю нанять grep для этой работы:

$ OPTS="\"-name user -age 20 -where Asia -eats Brains\""
$ grep -Po -- '-where \K\w*' <<< "$OPTS"
Asia

Объяснение:

  • -P : Perl-совместимый обычный выражение
  • -o : показать только совпадающие части
  • \ K : удалить все до этой точки
  • \ w * : сопоставить составную часть слова (синоним для [_ [ : alnum:]] )

Чтобы добавить " в список совпадающих символов:

$ grep -Po -- '-eats \K[_\"[:alnum:]]*' <<< $OPTS
Brains"
7
27.01.2020, 21:49

Использование awk

opts="OPTS=\"-name user -age 20 -where Asia -eats Brains\""
awk '{for(i=1;i<=NF;i++) {if($i~"-where") {print $(i+1)}}}' <<< "$opts"

Вывод

Asia

с использованием tr и sed

tr ' ' '\n' <<< "$opts" | sed -n '/-where/{n;p}'
Asia

с использованием tr и awk

tr ' ' '\n' <<< "$opts" | awk '/-where/{getline;print;}'
Asia

tr ' ' '\n' <<< "$opts" | awk '/-where/{x=NR+1;next}(NR<=x){print}'
Asia
0
27.01.2020, 21:49

Другой POSIX:

printf %s\\n "$opts" | tr -cs '[[:alnum:]-]' '[\n*]' | sed -n '/-where/{
  n
  p
}'
Asia

(Обратите внимание, что GNU tr не будет работать с многобайтовыми символами)

0
27.01.2020, 21:49

POSIXly:

after_first_where=${opts#*-where }
word_after_where=${after_first_where%% *}

Или разрешить любое количество пробелов между словами:

after_first_where=${opts#*-where}
word_after_where=${after_first_where#"${after_first_where%%[![:blank:]]*}"}
word_after_where=${word_after_where%%[[:blank:]]*}

Или вы можете сделать:

unset -v IFS; set -f # split on blanks, no glob
set -- $opts # splits $opts into $1, $2, $3...
while [ "$#" -ge 2 ]; do
  case $1 in
    (-age|-name|-where|-eats)
       eval "${1#-}=\$2" # assigns name=$2 or where=$2...
       shift 2;;
    (*) shift
  esac
done
printf '%s\n' "$name eats $eats in $where"

Обратите внимание, что в этом случае пробелы ограничены пробелом, табуляцией (и новой строкой), а не другими символами, которые могут считаться [:blank:] в вашей локали.

7
27.01.2020, 21:49

Небольшая правка в вашем скрипте:

#!/bin/bash
opts="OPTS=\"-name user -age 20 -where Asia -eats Brains\""
echo $opts
ok="0"
for word in $opts; do
  if [ "$ok" = "1" ] ; then
    echo $word
    break
  fi
  if [ "$word" = "-where" ] ; then
    ok="1"
  fi
done
4
27.01.2020, 21:49

Теги

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