2015-09-11 3 views
0

Я хочу изменить «это» во второй строке примера, но этого не происходит. Очень благодарен за идею, когда я ошибаюсь.Perl regex начало привязки строки не работает

echo "not this but 
this one" > test.txt 
perl -0777 -i -pe 's/^this/rhinoceros/igs' test.txt 
cat test.txt 
not this but 
this one 
+0

что '-0777' делает? Тебе это надо? –

+0

[Это объясняет] (http://stackoverflow.com/a/9671078/1156245). Я не уверен, что означает «выкалывание». Вы правы, хотя его удаление устраняет проблему. – geotheory

+2

Slurping читает целый файл сразу, и кажется, что вы хотите прочитать файл по одной строке в то время (то есть избавиться от этого параметра). –

ответ

5

У вас есть все неправильные модификаторы при замещении. Вы, по-видимому, хотите сделать только одно изменение, поэтому /g не нужно; текст, который должен быть согласован именно this, поэтому /i не является необходимым, и у вас нет точечными . символы в шаблоне, так /s ничего не делает

Что вы сделать потребность является /m (многоканальный) модификатор так, что ^ соответствует началу строки в середине строки, а также только в начале строки

Это должно работать для вас

perl -0777 -i -pe 's/^this/rhinoceros/m' test.txt 
+1

Упрощенный: 'perl -i -pe 's/^ this/rhinoceros /' test.txt' – ikegami

1

Вы используете флаг/s, на самом деле хотите флаг/m.

perl -0777 -i -pe 's/^this/rhinoceros/igm' test.txt 

s обрабатывает всю строку как одну строку, в то время как m матчей по нескольким линиям.

Edit: См http://perldoc.perl.org/perlre.html для более детального лечения s и m модификаторов, @ThisSuitIsBlackNot комментарии на ниже. Для практических целей s «обрабатывать [s] строку как одну строку».

+0

Спасибо! Вы знаете, что делает -0777', т. Е. Что ['slurping'] (http://stackoverflow.com/a/9671078/1156245)? – geotheory

+0

Как @ Сухой27 упомянул, что он читает целый файл в памяти сразу, а не перебирает его по строкам. Не уверен точно, каково ваше конечное состояние, но вам нужно будет вырезать файл, чтобы выполнить многострочную подстановку в командной строке с одним выстрелом. – swornabsent

+1

'' 'не обрабатывает всю строку как одну строку, она вызывает'. ', Чтобы соответствовать любому символу, включая символы новой строки. 'm' вызывает'^'и' $ 'для соответствия в начале или конце любой строки в любом месте строки, а не только для начала или конца всей строки. – ThisSuitIsBlackNot

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