2015-10-20 4 views
-1

У меня есть файл со строками, похожими на это:Извлечение нескольких совпадающих строк из совпадающих строк в файле с использованием СЭД

abcd u'current_count': u'2', u'total_count': u'3', u'order_id': u'90' 

я должен найти CURRENT_COUNT и Total_count для каждой строки файла. Я пытаюсь выполнить команду, но она не работает. Пожалуйста помоги.

grep current_count file | sed "s/.*\('current_count': u'\d+'\).*/\1/" 

Он выводит всю строку, но я хочу что-то вроде этого:

'current_count': u'3', 'total_count': u'3' 

ответ

1

Это печать всей строки, так как шаблон в команде s не соответствует, поэтому замене не происходит.

sed регулярных выражений не поддерживают \d для цифр или x+ для xx*. GNU sed имеет опцию -r для поддержки расширенного регулярного выражения, поэтому + будет метасимволом, но \d все еще не работает. GNU sed также позволяет \+ как метасимвол в основном режиме регулярного выражения, но это не стандарт POSIX.

Так или иначе, это будет работать:

echo -e "foo\nabcd u'current_count': u'2', u'total_count': u'3', u'order_id': u'90'" | 
sed -nr "s/.*('current_count': u'[0-9]+').*/\1/p" 
# output: 'current_count': u'2' 

Обратите внимание, что я пропустить Grep с помощью sed -n s///p. Я также мог бы использовать /current_count/ как адрес:

sed -r -e '/current_count/!d' -e "s/.*('current_count': u'[0-9]+').*/\1/" 

Или только с Grep печати только согласующая часть рисунка, а не вся линия:

grep -E -o "'current_count': u'[[:digit:]]+' 

(или задать расширенные вместо Grep - E). Я забыл, что grep -o - это поведение, требуемое для POSIX.

+0

Спасибо. Это работает, но почему вы использовали 'p' в конце команды sed. – Anuj

+0

@Anuj: 'sed -n' не выводит строки по умолчанию. 's /// p' печатает пространство с рисунком, только если была сделана успешная замена. Поэтому он также использует 's/pattern /' для фильтрации строк, выполняя задание, которое раньше выполнял 'grep', или что'/current_count /! D' (удалять несогласованные строки). Это все на странице man. –

0

Для меня это выглядит как своего рода данных сериализованными Python. В основном я попытался бы выяснить происхождение этих данных и проанализировать их правильно.

Однако, в то же время хака, sed может также использоваться здесь:

sed "s/.*current_count': [a-z]'\([0-9]\+\).*/\1/" input.txt 
sed "s/.*total_count': [a-z]'\([0-9]\+\).*/\1/" input.txt 
+0

Да, это данные запроса API Python. Я просто привел часть строки, например. И я попробовал ту же строку, что и в вашем ответе, но она не работает. Похоже, это должно работать, но не работает для меня. – Anuj

Смежные вопросы