正则表达式可以跨多行非贪婪地匹配,直到以特定字符串开头的行

石器

我将自己回答这个问题,但这整天使我感到满意,尽管在其他地方对此做了解释,但我认为我应该将其发布在解决方案中。

我遇到了一种情况,需要替换一些跨越多行的文本。不难发现有关如何跨多行进行匹配的线索。我的情况有点困难,因为我需要在多行中通配符匹配任何字符,直到在第一个不缩进的右括号处停止为止。

出于演示目的,我制作了一个示例文件,该文件具有令我难以接受的功能:

起始文件:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式匹配特定字符串

来自分类Dev

正则表达式以匹配以特定单词开头的字符串,然后以斜杠分隔的单词

来自分类Dev

正则表达式匹配多行字符串,以x开头,以y结尾,中间包含z,但不包含x

来自分类Dev

正则表达式匹配以特定字符串开头并以特定字符串结尾的字符串的内容

来自分类Dev

SQL子字符串非贪婪正则表达式

来自分类Dev

正则表达式需要在字符串开头匹配特殊字符

来自分类Dev

正则表达式匹配以字符开头和结尾的字符串

来自分类Dev

正则表达式:在开头或某些特殊字符后匹配字符串

来自分类Dev

正则表达式:匹配字符(字符串开头除外)

来自分类Dev

正则表达式匹配直到满足特定字符串或字符串结尾

来自分类Dev

正则表达式可删除以特定字符串开头的行中的空格

来自分类Dev

非贪婪的正则表达式开头但不包含字符串

来自分类Dev

正则表达式查找以#开头直到空格的字符串

来自分类Dev

正则表达式可以匹配任何带引号的字符串或特定的不带引号的字符串

来自分类Dev

正则表达式特定的匹配字符串

来自分类Dev

如何在正则表达式中以特定字符开头的字符串匹配

来自分类Dev

正则表达式匹配由字符串的开头和结尾或非单词字符限制的单词

来自分类Dev

正则表达式-跨多行匹配任何字符

来自分类Dev

正则表达式以匹配多行字符串

来自分类Dev

正则表达式中的分组,它匹配每个不以特定字符开头的子字符串

来自分类Dev

正则表达式可在以特定字符开头和结尾的字符串中查找多个匹配项

来自分类Dev

正则表达式惰性匹配与贪婪表达式匹配的字符串不匹配

来自分类Dev

正则表达式以匹配子字符串,但不能以某些字符开头

来自分类Dev

正则表达式与特定字符串匹配

来自分类Dev

正则表达式贪婪匹配以字符或字符串结尾结束

来自分类Dev

正则表达式匹配不应以特定字符开头或结尾的字符串

来自分类Dev

正则表达式 - 匹配仅包含数字并以特定数字开头的字符串

来自分类Dev

提取以特定预定义字符串正则表达式开头的行?

来自分类Dev

正则表达式匹配字符串以@ 开头

Related 相关文章

  1. 1

    正则表达式匹配特定字符串

  2. 2

    正则表达式以匹配以特定单词开头的字符串,然后以斜杠分隔的单词

  3. 3

    正则表达式匹配多行字符串,以x开头,以y结尾,中间包含z,但不包含x

  4. 4

    正则表达式匹配以特定字符串开头并以特定字符串结尾的字符串的内容

  5. 5

    SQL子字符串非贪婪正则表达式

  6. 6

    正则表达式需要在字符串开头匹配特殊字符

  7. 7

    正则表达式匹配以字符开头和结尾的字符串

  8. 8

    正则表达式:在开头或某些特殊字符后匹配字符串

  9. 9

    正则表达式:匹配字符(字符串开头除外)

  10. 10

    正则表达式匹配直到满足特定字符串或字符串结尾

  11. 11

    正则表达式可删除以特定字符串开头的行中的空格

  12. 12

    非贪婪的正则表达式开头但不包含字符串

  13. 13

    正则表达式查找以#开头直到空格的字符串

  14. 14

    正则表达式可以匹配任何带引号的字符串或特定的不带引号的字符串

  15. 15

    正则表达式特定的匹配字符串

  16. 16

    如何在正则表达式中以特定字符开头的字符串匹配

  17. 17

    正则表达式匹配由字符串的开头和结尾或非单词字符限制的单词

  18. 18

    正则表达式-跨多行匹配任何字符

  19. 19

    正则表达式以匹配多行字符串

  20. 20

    正则表达式中的分组,它匹配每个不以特定字符开头的子字符串

  21. 21

    正则表达式可在以特定字符开头和结尾的字符串中查找多个匹配项

  22. 22

    正则表达式惰性匹配与贪婪表达式匹配的字符串不匹配

  23. 23

    正则表达式以匹配子字符串,但不能以某些字符开头

  24. 24

    正则表达式与特定字符串匹配

  25. 25

    正则表达式贪婪匹配以字符或字符串结尾结束

  26. 26

    正则表达式匹配不应以特定字符开头或结尾的字符串

  27. 27

    正则表达式 - 匹配仅包含数字并以特定数字开头的字符串

  28. 28

    提取以特定预定义字符串正则表达式开头的行?

  29. 29

    正则表达式匹配字符串以@ 开头

热门标签

归档