2014-01-22 4 views
0

Я использую sed, чтобы извлечь что-то между двумя строками в файле. Я использую:Предотвратить sed из вывода остальной части файла

sed 's/^.*bbb //; s/ddd.*$//' '/Users/myName/Desktop/sedtest.txt' 

и файл содержит:

aaa bbb ccc ddd eee 
more random text 
… 

, когда я использую выше патч в следующей команде он успешно извлекает ccc, но он также выводит следующие строки. Она выводит:

ccc 
more random text 
… 

, но я хочу его только для вывода:

ccc 

Как изменить команду так, что она выводит только ccc? Кроме того, я не буду знать, что во время выполнения ccc является то, что между bbb и ddd

ответ

1

Попробуйте это:

grep bbb yourfile | grep ddd | sed yourcommand 

Это будет работать только на линиях, содержащих «БББ» и «ДДД».

0
sed 's/^.*bbb\(.*\)ddd.*$/|\1|/' /tmp/file.txt | grep '^|' | cut -d\| -f2 
1

Не нужно связывать greps, когда sed может делать это так же легко, как и сам.

sed 's/^.*bbb\(.*\)ddd.*$/\1/;t a;d;:a' /Users/myName/Desktop/sedtest.txt 
+1

«Как легко», сказал он, используя тайные и «плохо документированные» команды sed (http://www.grymoire.com/unix/sed.html). Каждый может читать «grep a | grep b», поскольку ... нахожу только строки, содержащие «a» и «b» :-) –

+0

Я получаю 'sed: 1: 's /^.* bbb \ (. * \) Ddd . * $/\ 1 ... ": undefined label 'a; d;: a'' при выполнении этой команды –

+0

@AdamJohns попробуйте поместить пробел после первого a, перед точкой с запятой. – Kevin

1

Это awk должны сделать:

awk '/bbb.*ddd/ {gsub(/.*bbb | ddd.*/,x);print}' file 
ccc 

Он выбирает линию только с bbb и ddd. Затем удалите все до bbb и от ddd

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