Можете Вы grep файл с помощью регулярного выражения и только производить часть соответствия строки?

Другой способ: здесь «разделителем является ' ' (пробел), вы можете указать ',' для конвертации денег.»

number.to_s.reverse.gsub(%r{([0-9]{3}(?=([0-9])))}, "\\1#{delimiter}").reverse
13
задан Olly 10 June 2009 в 10:23
поделиться

6 ответов

Вы можете использовать sed:

grep -E 'Failed to add (.*) to database'| sed 's/'Failed to add \(.*\) to database'/\1'
6
ответ дан 1 December 2019 в 20:30
поделиться

sed нормально работает без grep:

sed -n 's/Failed to add \(.*\) to database/\1/p' filename
15
ответ дан 1 December 2019 в 20:30
поделиться

Это должно сработать:

grep -x -e '(?<=Failed to add ).+?(?= to database)'

Он использует утверждение о положительном прогнозе, за которым следует совпадение с адресом электронной почты, за которым следует утверждение postivie look-behind. Это гарантирует, что он соответствует всей строке, но фактически использует (и, следовательно, возвращает) часть адреса электронной почты.

Параметр -x указывает, что grep должен соответствовать строкам, а не всему тексту.

2
ответ дан 1 December 2019 в 20:30
поделиться

или python:

cat file | python -c "import re, sys; print '\r\n'.join(re.findall('add (.*?) to', sys.stdin.read()))"
1
ответ дан 1 December 2019 в 20:30
поделиться

Если вы хотите использовать grep, более подходящим вариантом будет egrep;

About egrep

Search a file for a pattern using full regular expressions.

grep не всегда будет иметь полный набор функций для регулярного выражения.

-2
ответ дан 1 December 2019 в 20:30
поделиться

В последних версиях GNU grep есть опция -o , которая делает именно то, что вы хотите. ( -o для - only-matching ).

3
ответ дан 1 December 2019 в 20:30
поделиться