在正则表达式中,选择以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 ,这是我最初尝试使用的.*位置。这似乎与您的数据无关紧要,但是也许经验丰富的正则表达式可以为这一点提供解决方案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...