рассчитывать не вхождений подстроки в строке с помощью Баш
Это дает отсчет как 2, где в качестве модели произошло трижды в строке
echo "axxxaaxx" | grep -o "xx" | wc -l
echo "axxxaaxx" | grep -o "xx"
рассчитывать не вхождений подстроки в строке с помощью Баш
Это дает отсчет как 2, где в качестве модели произошло трижды в строке
echo "axxxaaxx" | grep -o "xx" | wc -l
echo "axxxaaxx" | grep -o "xx"
Использование -P
позволит PCRE, которая поддерживает lookarounds:
echo "axxxaaxx" | grep -P '(?<=x)x'
В этом случае мы используем 'назад', что означает, что мы будем соответствовать в x
, который перед ним стоит x
. Это дает нам возможность иметь перекрывающиеся матчи:
Как регулярное выражение «оценены»:
xxx
^^
|Cursor
Looking for x on this position, since there is nothing this will not match
xxx
^^
|Cursor
Looking for x on this position since it's found we got a match
xxx
^^
|Cursor
Looking for x on this position since it's found we got a match
grep
оленья кожа поддержка перекрывающихся согласование регулярных выражений. Он потребляет символы, которые совпадают. В этом случае вы можете включить Perl Compatible Regex (PCRE), используя -p
переключатель и использовать положительный взгляд вперед утверждение так:
$ echo "axxxaaxx" | grep -oP "x(?=x)"
x
x
x
$ echo "axxxaaxx" | grep -oP "x(?=x)" | wc -l
3
$
regex(?=regex2)
Положительных смотреть вперед утверждение находит все regex1
, после чего regex2
следующим образом. При совпадении символов для regex2
он НЕ потребляет символы, поэтому вы получаете 3 матча.
x(?=x)
Позитивный взгляд вперед утверждение находит все x
, что имеет x
после него.
В строке xxx
, 1-й x
матчи, потому что он имеет x
после него, второй x
тоже и третий x
нет.
Более подробную информацию и легко можно найти примеры here
Можете ли вы объяснить, что магия (= х?) Делает? – user2481458
Это раздел подкатегории http://stackoverflow.com/questions/37050030/no-of-occurences-of-patterns-in-string/37050288#37050288 – user2481458
Спасибо. Это справедливо для этого случая, но я пытался достичь этого: Учитывая строку, верните счетчик количества раз, когда в строке появляется строка подстроки 2, а также как последние 2 символа строки, поэтому " hixxxhi "дает 1 (мы не будем считать концевую подстроку). last2 ('hixxhi') → 1 last2 ('xaxxaxaxx') → 1 last2 ('axxxaaxx') → 2 – user2481458