我有一个要求,我必须获得文件中模式的文件名、行号、匹配位置(字节偏移量).

为此,我使用了grep命令,到目前为止,我可以毫无问题地获取文件名和行号,但无法分别获取每行的匹配位置.

grep中有一个-b选项,它给出字节偏移量,但不给出每一行的单独结果.

try 如下:

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

搜索模式:A

预期结果:

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

如果在Python中有任何其他相同的解决方案,那也是可以接受的.

推荐答案

如果你接受从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

Linux相关问答推荐

在程序集x86_64中跳转后调用ret时出现分段故障

在 bash 中使用 tee 时如何返回错误代码

使用来自 yocto build 而不是主机系统的 protoc

仅查找并保留有效邮箱并删除无效记录,AWK

如何验证所有 csv 文件是否具有相同的第一行?

在不编写任何代码的情况下,是否有一个命令可以检索当前 shell 的亲和力中的可用内核数?

`G++ 4.9.4` 中关于 WEXITSTATUS 的奇怪行为

你如何在 CentOS9 上使用 C++ fmt?

函数在 shell 脚本中抛出错误语法错误:} unexpected

在 puppet 中管理 linux 的用户密码

错误:命令gcc在 CentOS 上失败,退出状态为 1

如何在 Linux 中为 C 或 C++ 的进程设置 CPU 亲和性?

如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE

在 Linux/POSIX 系统上获取用户全名的最简单方法是什么?

如何在 Ubuntu 12.04 中更改 Jenkins 安装的端口号

何时判断 EINTR 并重复函数调用?

Linux 的 TextMate 替代品

如何使用 Ansible 等待服务器重启?

zsh:找不到命令 laravel

Linux下Eclipse在哪里找eclipse.ini