Попробуйте это:
$ sed -En 's/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/p' File
This text
Another thing
It try
Better
Если вкладка перед Better является проблемой, попробуйте это:
$ sed -En 's/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/; ta; b; :a; s/^\t//; p' File
This text
Another thing
It try
Better
Вышеописанное было протестировано на GNU sed ( gsed на OSX). Для BSD sed могут потребоваться некоторые незначительные изменения.
Как это работает
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/ Это ищет слово, [[:alnum:]]+, за которым следует пробел, [[:space:]], за которым следует что-либо, .*, за которым следует одно из ваших слов, text|thing|try|Better, за которым следует что-либо. Если это найдено, оно заменяется первым словом в строке (если есть), вкладкой и совпадающим словом. ta; b; :a; s/^\t//; p Если команда подстановки привела к замене, что означает, что одно из ваших слов было найдено в строке, тогда команда ta сообщает sed перейти к метке a. Если нет, то мы введем (b) в следующую строку. :a определяет метку a. Итак, если одно из ваших слов было найдено, мы (а) выполним подстановку s/^\t//, которая удаляет ведущую вкладку, если она есть, и (b) печатает (p) строку.
задан N.N.
17 November 2011 в 13:45
поделиться