2015-01-13 2 views
1

У меня есть текст, без строк, и я хочу, чтобы удалить все символы, которые не соответствуют шаблону:Удалить все символы/слова, которые не соответствуют шаблону

картины будет от слова до тех пор, пока не найдет }}. Например, если у меня есть такая запись:

KHJLMNNamespaceparameter:{{"Hello i am here"}}NamespaceHSKFSAFSLLLJparameter:{{H}}... 

Я хотел бы, чтобы удалить все и оставить это в файле: parameter:{{"Hello i am here"}} parameter:{{H}}.

Все, что я узнал, нужно удалить строку, которая не содержит шаблона, но я не могу найти ничего связанного с огромным файлом без/n (конец строк). Можно ли это сделать, используя либо sed, либо awk, либо Vi?

Спасибо!

ответ

4
$ awk 'BEGIN{RS=ORS="}}"} sub(/.*parameter/,"parameter")' file 
parameter:{{"Hello i am here"}}parameter:{{H}} 

Заметьте, что это поглазеть специфические благодаря мульти символьные RS.

+1

Этот ответ сработал для меня. – iOSAddicted

1

Если perl вариант, вы можете сделать это:

perl -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@wo);" your_text_file 

В Perl'е, модификатор *? является не жадный квантор, например, что он останавливается на первой встречается }}.

Я думаю эксперт Perl может сделать это в одной команде, без временного массива ...

EDIT: эта команда выводит только разыскиваемого текст на стандартный вывод. Для того, чтобы изменить сам файл, используйте переключатель -i при вызове Perl:

perl -i.bak -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@wo);" your_text_file 

резервного копирования создается файл с расширением .bak добавляется в конце, и результат записывается в файл с тем же именем, что и введите имя файла. Обратите внимание: вы не можете получить файл резервной копии только с swtich -i, но некоторые платформы этого не допускают. См. doc perlrun для получения дополнительной информации.

+0

Я только что протестировал, но это не сработает ... спасибо в любом случае! – iOSAddicted

+0

Работает для меня, выход такой же, как и вы. Не могли бы вы уточнить ошибку/неудачу? Какую версию Perl вы используете? Шахта - 5.20.1 – Bentoy13

+0

Он просто не печатает какой-либо выход. Все, что я делаю, это ваша команда в терминале на macOSX, perl -ne "my @wo = ($ _ = ~ /parameter:\{\{.*?\}\}/g); print join ('', @ Wo);» output.txt, но ничего не печатает ... Моя версия perl 5.16.0 – iOSAddicted

1

Вы можете использовать эту grep с -P (PCRE) регулярное выражение:

grep -oP '.*?\Kparameter:\{\{.*?\}\}' file 
parameter:{{"Hello i am here"}} 
parameter:{{H}} 
Смежные вопросы