У меня есть строка, например
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
Допустим, я знаю, что моя строка наверняка будет содержать подстроку IceCream, но я не знаю, что за ней следует.
Это может быть 123, как в моем примере, или это может быть что-то другое.
Хотя я могу использовать grep, чтобы определить, существует ли в моей строке подстрока "Icecream", с помощью следующей команды
echo $string | grep -oF 'Icecream';
Который напечатает
Icecream
Я хочу с помощью команды, чтобы он напечатал всю подстроку, которая в моем примере
Icecream123
Конечно, то, что следует за Icecream, является случайным и неизвестно заранее, поэтому я не могу просто сделать
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
bash
shell-script
grep
Sonamor
источник
источник
Icecream123 AirplaneBCD
вы хотите остановиться на123
. Это потому, что после 3 есть пробел или что-то еще?Ответы:
Если вы
grep
поддерживаете регулярные выражения, совместимые с perl, вы можете не жадно сопоставлять их со следующей границей слова:В противном случае сопоставьте самую длинную последовательность непустых символов:
Или оставьте все в оболочке и удалите самую длинную последовательность символов, начинающуюся с пробела:
источник
'Icecream\S+'
некоторые непустые символы.Используя
grep
что знает о-o
:Шаблон
\<Icecream[^[:blank:]]*
соответствует строкеIcecream
(где ейI
предшествует не состоящий из слов символ или начало строки), за которым следует ноль или более непустых пробелов (не пробелов или табуляций).Использование
awk
:В
awk
программе делит строку в разделенных пробелами записи и тесты каждый один. Он напечатает те, которые начинаются со строкиIcecream
.Используя
mawk
или GNUawk
, вы также можете использоватьпоскольку они интерпретируются
RS
как регулярное выражение, если оно содержит более одного символа.С
sed
, аналогично как сgrep
:Использование
/bin/sh
:Perl (с небольшой помощью
tr
):или просто
источник
echo "$string" | grep -o '\S\+' | grep "Icecream"
Так как вы отметили Bash:
В более общем смысле, для условия поиска в
$search
:... или с расширением параметра:
источник
Например, если вы используете
GNU grep
:Это использует
PCRE
.источник
Возможно, немного проще, особенно если учесть, что ваша версия grep не поддерживает регулярные выражения Perl:
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123
tr
Разбивает строку на строки, заменяя все пространства с символами новой строки. Тогда вы можете использоватьgrep
легко.Вы также можете написать следующее, чтобы получить только то, что следует за словом, которое вы ищете:
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123
источник