Я собираюсь ответить на это сам, но это дало мне приступы весь день, и хотя это объяснялось в другом месте, я думал, что я опубликую это с моим решением.
Я столкнулся с ситуацией, когда я необходимо заменить текст, занимающий несколько строк. Нетрудно было найти темы о том, как сопоставить несколько строк. Мой случай был немного сложнее в том смысле, что мне нужно было сопоставлять любой символ в нескольких строках до тех пор, пока я не остановился на первой без отступа закрывающей скобке.
В демонстрационных целях я создал пример файла с функциями это сделало это для меня трудным:
начальный файл:
cat << EOF > test.txt
server {
abcdefg blablablabla
pizza
#blablablabla
blablablabla {
zazazazazaza
}
turtles
#}
ninjas
blablablabla
} #comments that might or might not be here
server {
blablablabla
blablablabla
blablablabla
blablablabla
}
zabzazab
EOF
Это был мой желаемый вывод. Обратите внимание, что скобка, с которой я сопоставляюсь, не является ни первым, ни последним вхождением закрывающей скобки. Его единственная отличительная особенность в том, что быть первым }
в начале строки после начала моего матча:
server {
wxyz
server {
blablablabla
blablablabla
blablablabla
blablablabla
}
zabzazab
То, что я надеялся, сработает. Но slupring с 0777
убирает маркеры для начала и конца линии, так что это не сработало:
~# perl -0777 -pe 's/(abcdefg(.*?)(^}.*$))/wxyz/gs' test.txt
server {
abcdefg blablablabla
pizza
#blablablabla
blablablabla {
zazazazazaza
}
turtles
#}
ninjas
blablablabla
} #comments that might or might not be here
server {
blablablabla
blablablabla
blablablabla
blablablabla
}
zabzazab
Сопоставление начала / конца линии, в то время как slupring также был точкой отсчета:
~# perl -0777 -pe 's/(abcdefg(.*?)(}))/wxyz/gs' test.txt
server {
wxyz
turtles
#}
ninjas
blablablabla
} #comments that might or might not be here
server {
blablablabla
blablablabla
blablablabla
blablablabla
}
zabzazab
Так есть ли способ получить регулярное выражение для сопоставления между строкой и первым экземпляром {
, который появляется в начале строки? Я тоже открыт для использования sed, но я полагал, что не жадный характер моего поиска сделает perl лучшим выбором.