我将自己回答这个问题,但这整天使我感到满意,尽管在其他地方对此做了解释,但我认为我应该将其发布在解决方案中。
我遇到了一种情况,需要替换一些跨越多行的文本。不难发现有关如何跨多行进行匹配的线索。我的情况有点困难,因为我需要在多行中通配符匹配任何字符,直到在第一个不缩进的右括号处停止为止。
出于演示目的,我制作了一个示例文件,该文件具有令我难以接受的功能:
起始文件:
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
我希望能成功。但是用slupling会删除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
匹配行的开始/结束,但同时也是最大的障碍:
~# 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成为更好的选择。
也许以下任何命令都能做到
perl -0777 -pe 's/abcdefg.*?(\nserver.*?)/wxyz\n$1/s' test.txt
perl -0777 -pe 's/abcdefg.*?server/wxyz\n\nserver/s' text.txt
perl -0777 -pe 's/abcdefg.*?}.*?}.*?}.*?\n/wxyz\n/s' test.txt
perl -0777 -pe 's/abcdefg(.*?}){3}.*?\n/wxyz\n/s' test.txt
perl -0777 -pe 's/abcdefg.*?\n}.*?\n/wxyz\n/s' test.txt
输出量
server {
wxyz
server {
blablablabla
blablablabla
blablablabla
blablablabla
}
zabzazab
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句