如何解决在正则表达式中,选择以edit开头的行,并忽略其余字符,在行末插入“
下面的是文本文件的一部分(整个文件为3600行),我想在每行的末尾添加一个引号,该行以编辑开始,而忽略了直到该行的最后一个字符插入结尾处的内容“。我在记事本++中使用正则表达式,然后查找并替换。
set subnet 3.0.21.30/32
next
edit "3.0.34.106/32
set subnet 3.0.34.106/32
next
edit "3.1.217.15/32
set subnet 3.1.217.15/32
next
edit "3.80.211.237/32
set subnet 3.80.211.237/32
next
edit "3.81.91.109/32
set subnet 3.81.91.109/32
解决方法
这样对您有帮助吗?
模式:
(^edit.*)
替换:
\1"
https://regex101.com/r/SlSplf/1
这将在末尾添加引号。暂时不知道notepad ++的局限性,但从我阅读的内容来看,它似乎可以为您服务。
测试字符串:
set subnet 3.0.21.30/32
next
edit "3.0.34.106/32
set subnet 3.0.34.106/32
next
edit "3.1.217.15/32
set subnet 3.1.217.15/32
next
edit "3.80.211.237/32
set subnet 3.80.211.237/32
next
edit "3.81.91.109/32
set subnet 3.81.91.109/32
,
这是我在R中实现解决方案的方式-它可能不是最优雅的,但是可以完成工作。也许您可以考虑使用R代替记事本,但是它应该具有一些类似的功能。我使用包tlsCaCerts
中的str_replace_all
函数来选择以stringr
开头的行中的最后一个字符,然后用该字符的值和右引号替换该字符。
这就是我要做的。首先我把它变成一个字符串
edit
我更喜欢使用双引号将字符串括起来,因此我将字符串内的所有引号都更改为单引号。现在,在“编辑”行中添加右引号。
string <- "set subnet 3.0.21.30/32
next
edit '3.0.34.106/32
set subnet 3.0.34.106/32
next
edit '3.1.217.15/32
set subnet 3.1.217.15/32
next
edit '3.80.211.237/32
set subnet 3.80.211.237/32
next
edit '3.81.91.109/32
set subnet 3.81.91.109/32"
让我们分解一下。 library(stringr)
str_replace_all(string,"(?<=\\nedit(.){0,10000})(.)(?=\\n)","\\2'")
的语法为str_replace_all
我们希望将表达式替换为以edit开头的行末的字符。为了隔离该字符,我使用了一个回首和回首。后面的后面指明了我们希望字符前面带有换行符,单词“ edit”以及一些字符。第二个(string,"expression to replace","replacement expression")
是我们要替换的字符。我允许它是任何非换行符,但是如果它总是像您的示例中那样是数字,则可以将(.)
更改为(.)
。前瞻指定我们希望字符在换行符之前(即成为其行中的最后一个字符)。请注意,选择范围中不包括前行和后向字符。这使我们能够隔离自己感兴趣的角色。
我们要用该字符替换的表达式是(\\d)
\\2'
指的是第二个捕获组,这意味着第二组括号中包含的字符(在本例中是第二个括号) \\2
的实例,这是我们要替换的字符。我们将其替换为字符本身,并在其后加上引号。
我们可以使用writeLines来查看应用替换后的字符串外观:
(.)
现在,所有“编辑”行的末尾都有一个引号。
我的解决方案中可以改进的部分是我使用{0,10000}来代替单词“ edit”之后的无数字符。 Lookbehinds不允许使用无界的最大字符串,例如 writeLines(str_replace_all(string,"\\2'"))
set subnet 3.0.21.30/32
next
edit '3.0.34.106/32'
set subnet 3.0.34.106/32
next
edit '3.1.217.15/32'
set subnet 3.1.217.15/32
next
edit '3.80.211.237/32'
set subnet 3.80.211.237/32
next
edit '3.81.91.109/32'
set subnet 3.81.91.109/32
,这是我最初尝试使用的.*
位置。这似乎与您的数据无关紧要,但是也许经验丰富的正则表达式可以为这一点提供解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。