2010-08-23 3 views
0

Например, скажем, у меня есть текстовый файл example.txt, который гласит: Мне нравятся собаки. Моя любимая собака - Джордж, потому что он моя собака. Джордж - хорошая собака.Как извлечь первое слово, которое следует за строкой?

Теперь, как извлечь «Джордж», учитывая, что это первое слово, которое следует за «Моя любимая собака»?

Что делать, если имеется более одного места, например. Моя любимая собака George .....

Есть ли способ надежно извлечь слово «Джордж» независимо от количества пробелов между «Моя любимая собака» и «Джордж»?

ответ

0

Вы можете сделать:

cat example.txt | perl -pe 's/My favorite dog is\s+(\w+).*/\1/g' 

Он выводит Geroge

+0

Спасибо! Что делать, если я хочу извлечь 105.15088 из blah blah ! HEAT OF FORMATION 105.14088 93.45997 46.89387 blah blah – Feynman

+0

Вы можете попробовать 'cat input | perl -pe 's/blah blah! ТЕПЛО ОБРАЗОВАНИЯ \ s + (\ S +) \ s. */\ 1/g'' – codaddict

+0

Бесполезное использование 'cat' (дважды). –

1

Если вы не установили Perl вы можете использовать СЭД:

cat example.txt | sed 's/my favourite dog is *\([a-zA-Z]*\) .*/\1/g' 
+0

Спасибо. Могу я спросить, что является самым быстрым в этом - используя bash (sed), жемчуг или что-то еще? – Feynman

+0

Я не уверен, но я бы предположил, что sed быстрее, чем perl для небольших файлов из-за более быстрого запуска. Для больших файлов я понятия не имею. –

+0

@Feynman: 'sed' не имеет ничего общего с Bash или наоборот, кроме того, что' sed' - это программа, которая может быть порождена оболочкой, а Bash - оболочкой. Однако вы можете использовать Bash для выполнения извлечения строки (см. Мой ответ). –

1

Pure Bash:

string='blah blah ! HEAT OF FORMATION 105.14088 93.45997 46.89387 blah blah' 
pattern='HEAT OF FORMATION ([^[:blank:]]*)' 
[[ $string =~ $pattern ]] 
match=${BASH_REMATCH[1]} 
0

Если вы пытаетесь выполнить поиск файла, особенно если у вас большой файл, использование внешних инструментов, таких как sed/awk/perl, выполняется быстрее, чем использование чистых строк bash и манипуляций с строкой bash.

sed 's/.*HEAT OF FOMATION[ \t]*\(.[^ \t]*\).*/\1/' file 

Чистые манипуляции с строкой bash хороши только тогда, когда вы обрабатываете несколько простых строк внутри вашего скрипта. Как манипуляция переменной.

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