首页 > 解决方案 > 如何使用正则表达式选择包含字符串的特定列?

问题描述

我正在使用 EmEditor 进行一些文本处理,因为我正在处理的文件是一个大文件。我正在使用正则表达式一次选择一列,同时搜索一个字符串。

我目前正在使用正则表达式代码突出显示不包含我正在搜索的字符串的行。但我需要一个正则表达式代码,它只能突出显示不包含我正在搜索的字符串的列(一次一列)的内容。

例如,我目前正在使用以下正则表达式代码突出显示不包含字符串的行12345 ^((?!12345).)*$ 但是,我正在寻找一个正则表达式代码,可以突出显示不包含字符串 say 的第 10 列12345并替换其他同一列的内容与我选择的字符。我正在寻找的字符串每次都不同,并且列每次都不同。

我的文件包含以下内容,我12345在第一列中搜索:

   12345,6457,789
   4568,21231,657

查找后所需的输出12345是在这种情况下选择/标记第一列的内容是123and 4568。一旦选择/标记了这些,我就可以使用 EmEditor 中的查找和替换选项将它们替换为我选择的字符。第二个例子,使用上面我456在第三列中搜索的相同示例。查找后所需的输出456是在这种情况下选择/标记了第三列的内容是789657。如果有一个正则表达式代码,它有一个可修改的列位置和(可修改的)字符串,我正在寻找类似于awk代码的东西,例如,awk $1或者awk ($1,$3)一个可修改的列位置。

感谢您的友好回复@nonForgivingJesus。我会尝试 Vim,因为它看起来很有希望。是否有可能将匹配项替换为“a”,而将不匹配的内容向右移动,同时将其余列向右移动但保持顶行不变并将第 1 列中的空白替换为“b”?例如,

   12345,6457,789,21231,657
   6457,21231,657
   12345,789,21231

查找 12345 时的输出应为:

a,6457,789,21231,657
b,6457,21231,657
a,789,21231

查找 6457 时的输出应为:

a,a,789,21231,657
b,a,21231,657
a,b,789,21231

查找 789、21231 和 657 后,最终输出应如下所示:

a,a,a,a,a
b,a,b,a,a
a,b,a,a,b,

谢谢。

标签: regextext-processingemeditor

解决方案


如果您使用 Vim,您可以通过按进入“可视块模式” Ctrl+V,然后按G(如果您看到大写字符 - 这是Shift+*char*. 在这种情况下Shift+g),然后选择列边框内的文本(如果你以前没用过 Vim,你可以在键盘上使用箭头,但更多的 Vim'ish 方法是 via hjkl)。

你也应该在 Vim 中设置高亮模式,按下:和书写set hlsearch

然后你应该按下/输入搜索并输入你想要搜索的文本(你可以在这里使用正则表达式,但是据我所知,vim本身不支持PCRE风格。开箱即用它支持基本和扩展正则表达式,但我相信它可以通过插件进行增强)。这将搜索整个选择:

12345 搜索 在此处输入图像描述

您也可以将整个选择传递给另一个程序,按下:然后!:进入命令模式并!创建终端并将选定的文本传递给程序,紧随其后!):

通过选择

在这里,我将选择传递给cut程序,将列分隔符设置为,( -d,) 并仅请求输出中的第二列 ( -f2)。您可以通过 映射例行操作:map,但您最好自己阅读相关内容。

我建议您这个播放有关使用 Vim 优化生活的播放列表,我个人喜欢它。

PS您也可以通过Ctrl+a(加法)Ctrl+x(减法)对文本进行算术运算,但这超出了问题的范围:)


推荐阅读