2017-01-16 3 views
-1

sample_file:Поиск и замена Однострочник сохранить символы новой строки

this is a test line! 
this is a test line! 
this is a test line! 
this is a test line! 

Я использую Perl Однострочник, чтобы заменить текст, как это:

perl -pi -e 's{this(.*)\s}{\n\1\n}i && s{.*\n}{}' sample_file 

В this(.*)\s часть и \1 часть являются переменная, и я не могу ее изменить (она поступает от пользовательского ввода).

Моя проблема в том, что мне нужно отрегулировать часть {\n\1\n} в зависимости от того, включает ли первое регулярное выражение символ новой строки.

Например, если первое регулярное выражение {this(.*)\s} мне нужно {\n\1\n}, но если первый, как {(.*)a test} мне нужно {\n\1}.

Как я могу проверить, потерян ли символ новой строки и, если необходимо, вернуть его обратно?

+0

Это не сработает в первую очередь - '-pi' приведет к тому, что ваша вещь будет итерации по очереди в любом случае. – Sobrique

+0

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

+0

Вы действительно не должны просить своих пользователей вводить шаблоны регулярных выражений! – Borodin

ответ

1

В общем, вы хотите, чтобы chomp вводил линии и добавлял новую строку для вывода строк. -l (в сочетании с -n или -p) сделают оба.

Например, следующая строка не заменяет новую строку: !, потому что она была удалена -l (и впоследствии повторно добавлена ​​print).

perl -i -ple's/\s/!/g' file 

Кстати, \1 («соответствует тому, что первый захват в плен») не имеет никакого смысла в замене. Вы хотите $1 (как сказал бы -w).

+0

Спасибо, в основном -l решает мои проблемы! – zjeraar

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