Другой способ: здесь «разделителем является ' '
(пробел), вы можете указать ','
для конвертации денег.»
number.to_s.reverse.gsub(%r{([0-9]{3}(?=([0-9])))}, "\\1#{delimiter}").reverse
Вы можете использовать sed:
grep -E 'Failed to add (.*) to database'| sed 's/'Failed to add \(.*\) to database'/\1'
sed
нормально работает без grep:
sed -n 's/Failed to add \(.*\) to database/\1/p' filename
Это должно сработать:
grep -x -e '(?<=Failed to add ).+?(?= to database)'
Он использует утверждение о положительном прогнозе, за которым следует совпадение с адресом электронной почты, за которым следует утверждение postivie look-behind. Это гарантирует, что он соответствует всей строке, но фактически использует (и, следовательно, возвращает) часть адреса электронной почты.
Параметр -x
указывает, что grep должен соответствовать строкам, а не всему тексту.
или python:
cat file | python -c "import re, sys; print '\r\n'.join(re.findall('add (.*?) to', sys.stdin.read()))"
Если вы хотите использовать grep, более подходящим вариантом будет egrep;
About egrep
Search a file for a pattern using full regular expressions.
grep не всегда будет иметь полный набор функций для регулярного выражения.
В последних версиях GNU grep есть опция -o
, которая делает именно то, что вы хотите. ( -o
для - only-matching
).