regex - 如何使用正则表达式选择包含字符串的特定列?
问题描述
我正在使用 EmEditor 进行一些文本处理,因为我正在处理的文件是一个大文件。我正在使用正则表达式一次选择一列,同时搜索一个字符串。
我目前正在使用正则表达式代码突出显示不包含我正在搜索的字符串的行。但我需要一个正则表达式代码,它只能突出显示不包含我正在搜索的字符串的列(一次一列)的内容。
例如,我目前正在使用以下正则表达式代码突出显示不包含字符串的行12345
^((?!12345).)*$
但是,我正在寻找一个正则表达式代码,可以突出显示不包含字符串 say 的第 10 列12345
并替换其他同一列的内容与我选择的字符。我正在寻找的字符串每次都不同,并且列每次都不同。
我的文件包含以下内容,我12345
在第一列中搜索:
12345,6457,789
4568,21231,657
查找后所需的输出12345
是在这种情况下选择/标记第一列的内容是123
and 4568
。一旦选择/标记了这些,我就可以使用 EmEditor 中的查找和替换选项将它们替换为我选择的字符。第二个例子,使用上面我456
在第三列中搜索的相同示例。查找后所需的输出456
是在这种情况下选择/标记了第三列的内容是789
和657
。如果有一个正则表达式代码,它有一个可修改的列位置和(可修改的)字符串,我正在寻找类似于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,
谢谢。
解决方案
如果您使用 Vim,您可以通过按进入“可视块模式” Ctrl+V
,然后按G
(如果您看到大写字符 - 这是Shift+*char*
. 在这种情况下Shift+g
),然后选择列边框内的文本(如果你以前没用过 Vim,你可以在键盘上使用箭头,但更多的 Vim'ish 方法是 via hjkl
)。
你也应该在 Vim 中设置高亮模式,按下:
和书写set hlsearch
然后你应该按下/
输入搜索并输入你想要搜索的文本(你可以在这里使用正则表达式,但是据我所知,vim本身不支持PCRE风格。开箱即用它支持基本和扩展正则表达式,但我相信它可以通过插件进行增强)。这将搜索整个选择:
您也可以将整个选择传递给另一个程序,按下:
然后!
(:
进入命令模式并!
创建终端并将选定的文本传递给程序,紧随其后!
):
在这里,我将选择传递给cut
程序,将列分隔符设置为,
( -d,
) 并仅请求输出中的第二列 ( -f2
)。您可以通过 映射例行操作:map
,但您最好自己阅读相关内容。
我建议您播放有关使用 Vim 优化生活的播放列表,我个人喜欢它。
PS您也可以通过Ctrl+a
(加法)Ctrl+x
(减法)对文本进行算术运算,但这超出了问题的范围:)
推荐阅读
- javascript - Safari http 请求标头未反映 axios 拦截器的更改
- html - 未正确对齐 CSS 网格
- powershell - Powershell 中的 Get-PowerBIWorkspace 返回空白元素
- android - 坚持了过去3天。有什么解决方案?
- r - 从 R 循环内的列表中的 S4 对象访问槽
- mysql - 在 Windows10 64 位机器上将 MySQL ODBC 连接到 VBScript 中的 32 位的正确方法是什么?
- ruby-on-rails - Rails 迁移中块中的列定义如何工作?
- python - Python语音识别:AttributeError:模块'speech_recognition'没有属性'record'
- bash - 如何在bash的文件名中插入变量?
- php - php正则表达式连接不需要的反斜杠