2013-06-03 3 views
-1

Я хочу слова после слова «тест» из строки в файле. означает в actuaaly, я не хочу слов, предшествующих «тестовому» слову.Как удалить слова строки до определенного символьного шаблона ... Regex

Вот картины ...

например:

Вход:

***This is a*** test page. 

***My*** test work of test is complete. 

Выход:

test page. 

work of test is complete. 
+0

Я не уверен, что я понимаю, что это за образец. Не могли бы вы пояснить, пожалуйста? – Jerry

+0

рисунок есть: что угодно перед словом "test". –

ответ

7

Использование СЭДА:

sed -n 's/^.*test/test/p' input 

Если вы хотите напечатать несовпадающие линии, нетронутый:

sed 's/^.*test/test/' input 

один выше удалит (жадность) весь текст до последнего test на линии. Если вы хотите удалить до первого теста, используйте предложение Potong:

sed -n 's/test/&\n/;s/.*\n//p' input 
+0

спасибо ... это работает !!! На самом деле, моя попытка: sed/s. /./+ Test \/test/g '.... но он не работает. –

+0

не могли бы вы объяснить, когда использовать'. * 'И когда использовать'. \ + '? Я новичок в regex ... спасибо заранее. Я признателен, если вы дадите мне действительно полезные ссылки для reugx tutorail ... –

+1

с sed, лучше всего избегать '+' вообще. Но если вам нужно, используйте его, если вам действительно нужно что-то предшествующее 'test'. С помощью '^. \ + Test' вы не можете сопоставить« тест завершен », потому что точка должна соответствовать хотя бы одному символу с символом' + '. – perreal

4

Чистый один вкладыш:

while read x; do [[ $x =~ test.* ]] && echo ${BASH_REMATCH[0]}; done <infile 

Вход: входной_файл

This is a test page. 
My test work of test is complete. 

Выход:

test page. 
test work of test is complete. 

Он читает все строки из файла infile, проверяет, является ли строка содержит строку test, а затем печатает остальную часть строки (в том числе test).

То же самое в :

Сед «ы /. (тест)/\ 1/'infile.* жадный, поэтому он слишком сильно срезается со второй строки примера). Это хорошо работает:

sed -e 's/\(test.*\)/\x03&/' -e 's/.*\x03//' infile 

Я сделал некоторые тесты скорости (для оригинала (неправильно) версии). В результате для небольших файлов решение работает лучше. Для более крупных файлов лучше . Я также попробовал эту версию, которая еще лучше для больших файлов:

awk 'match($0,"test.*"){print substr($0,RSTART)}' infile 

Похожие в :

perl -ne 's/(.*?)(test.*)/$2/ and print' infile 

я использовал две строки пример входного файла и я дублировал его каждый раз. Каждая версия запускается 1000 раз. Результат:

Size | bash | sed | awk | perl 
    [B] | [sec] | [sec] | [sec] | [sec] 
------------------------------------------ 
    55 | 0.420 | 10.510 | 10.900 | 17.911 
    110 | 0.460 | 10.491 | 10.761 | 17.901 
    220 | 0.800 | 10.451 | 10.730 | 17.901 
    440 | 1.780 | 10.511 | 10.741 | 17.871 
    880 | 4.030 | 10.671 | 10.771 | 17.951 
    1760 | 8.600 | 10.901 | 10.840 | 18.011 
    3520 | 17.691 | 11.460 | 10.991 | 18.181 
    7040 | 36.042 | 12.401 | 11.300 | 18.491 
14080 | 72.355 | 14.461 | 11.861 | 19.161 
28160 |145.950 | 18.621 | 12.981 | 20.451 
56320 |  |  | 15.132 | 23.022 
112640 |  |  | 19.763 | 28.402 
225280 |  |  | 29.113 | 39.203 
450560 |  |  | 47.634 | 60.652 
901120 |  |  | 85.047 |103.997 
+0

@ пользователь1640065: один пункт непонятный.Что делать, если строка не содержит слова 'test'. Сейчас ничего не печатают. – TrueY

+0

в моем случае каждая строка ввода должна содержать «тест». (Actuaaly я разбираю файл журнала и выполняю работу по определенному шаблону. В моем случае «тест» на самом деле является «Исключением». –

+0

, но я хочу это с помощью команды sed –

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