linux 需要获取文件名、行号、模式在文件中的匹配位置[重复]

hkmswyz6  于 2023-05-16  发布在  Linux
关注(0)|答案(1)|浏览(136)

此问题已在此处有答案

Python - Locating the position of a regex match in a string?(3个答案)
4天前关闭。
此帖子4天前编辑并提交审核,未能重新打开帖子:
原始关闭原因未解决
我有一个要求,我必须得到文件名,行号,匹配位置(字节偏移量)的模式在文件中。
我正在使用grep命令,到目前为止,我能够获得文件名和行号没有问题,但无法单独获得每行的匹配位置。
grep中有一个-b选项,它给出了字节偏移量,但并没有单独给出每行的结果。
在下面尝试:

grep --with-filename -n -r -E -o "pattern" file.txt

这将给出文件名和行号沿着匹配线。

grep --with-filename -n -r -E -o -b "pattern" file.txt

这给出了字节偏移量(行中匹配的位置),但它将整个文件视为一行并给出结果,但我需要从该行开始的每行的位置结果,而不是文件的开始。
例如:file.txt

abc
def
xyzva

检索模式:一个
预期结果:

file.txt:1:0:abc
file.txt:3:4:xyzva

如果Python中有任何其他解决方案,也是可以接受的。

kupeojn6

kupeojn61#

如果您同意位置以1开头(与0相对),则可以使用ripgrep

$ cat ip.txt
abc
def
xyzva

$ rg -H --column --no-heading 'a' ip.txt
ip.txt:1:1:abc
ip.txt:3:5:xyzva

您可以使用awk来实现更可定制的解决方案:

$ awk 'match($0, /a/){print FILENAME, NR, RSTART, $0}' OFS=: ip.txt
ip.txt:1:1:abc
ip.txt:3:5:xyzva

$ awk 'match($0, /a/){print FILENAME, NR, RSTART-1, $0}' OFS=: ip.txt
ip.txt:1:0:abc
ip.txt:3:4:xyzva

相关问题