AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 732378
Accepted
Ray Andrews
Ray Andrews
Asked: 2023-01-20 09:23:38 +0800 CST2023-01-20 09:23:38 +0800 CST 2023-01-20 09:23:38 +0800 CST

grep:仅对每行中的第一个匹配项进行着色

  • 772
INPUT | grep --color=always "$string\{1,1\}"

... 唉, $string 的每个实例都被突出显示了。在我阅读文档时,“{1,1}”应该确保只突出显示第一个实例。或者有更好的工具吗?我不能使用 sed

INPUT | sed -r "s|$string|${red}$string${nrm}|I"

( ${red} 和 ${nrm} 只是颜色代码)

因为这里的 INPUT 是一个文件列表,可能会发现不区分大小写,如果我在 sed 中使用“I”选项,它会强制文件列表的大小写更改为命令输入的确切文本——即是,我想搜索不带大小写的文件,但不管文件列表中字符串的大小写可能恰好是什么,我都不敏感地突出显示。

my_command *file_name*

...将使用“查找”不区分大小写地查找文件,但在列表中我想强调:

file_name 
FILE_nAME 
file_NAME_this_file_has_a_long_file_name

...但只有第一个实例(文件名可能包含输入字符串的重复项)。因此,在上面的最后一行中,突出显示了“file_NAME”,但没有突出显示“file_name”。

grep 对案例问题没有问题,但 sed 有。OTOH,sed 知道如何在一场比赛后停止,而 grep 似乎不知道。或者,还有更好的方法?

grep
  • 2 2 个回答
  • 46 Views

2 个回答

  • Voted
  1. Stéphane Chazelas
    2023-01-20T11:14:19+08:002023-01-20T11:14:19+08:00

    如果你grep支持-P类似 perl 的正则表达式,你可以这样做:

    grep --color=always -P "^.*?\K\Q$string\E"
    

    每行只能匹配一次,因为我们^用于将匹配锚定在行的开头。紧随其后的是匹配尽可能少的.*?任意数量的字符,并且在/内,因此变量的内容按字面匹配,即使它恰好包含正则表达式运算符(除了)。指定只有后面的内容是ept,所以这里是彩色的。$string\Q\E$string\E\KK

    或者您可以使用真实的东西而不必依赖任何 GNUism:

    STRING=$string perl -ne 'print if s/\Q$ENV{STRING}\E/\e[31m$&\e[m/'
    

    即使$string包含\E.

    • 2
  2. Best Answer
    LSerni
    2023-01-20T09:47:29+08:002023-01-20T09:47:29+08:00

    我认为如果使用模式替换就可以使用sed(匹配不区分大小写,但替换使用捕获的模式,而不是搜索到的模式):

    INPUT | sed -r "s|(${string})|${red}\\1${nrm}|I"
    

    此外,正如@don_crissti 所注意到的,如果你想为整个找到的模式着色,你甚至不需要使用捕获组,你可以使用“whatever it was”&代码,它可能也稍微快一点:

    INPUT | sed -r "s|${string}|${red}&${nrm}|I"
    

    使用两个字符串而不是颜色代码,它似乎适用于我的 bash:

    $ red="_RED_"
    $ nrm="_NORM_"
    $ string="amd"
    $ echo -e "linux-5.4.0-amd-backfire.tar.bz2\\nThis is AMD Radeon\\nNames: Amdiranifani amd Jefri" \
      | sed -r "s|(${string})|${red}\\1${nrm}|I"
    
    linux-5.4.0-_RED_amd_NORM_-backfire.tar.bz2
    This is _RED_AMD_NORM_ Radeon
    Names: _RED_Amd_NORM_iranifani amd Jefri
    

    第三行的第二个“amd”没有被替换,所有其他替换的都保持原来的大小写。

    grep语法意味着它将匹配模式的第一个连续重复,因此在“bababa”中将仅匹配第一个“ba”,但在“baba___ba”中它将匹配第一次和第三次出现。

    显然grep 为整个匹配着色,因此不能在这种情况下使用。

    • 1

相关问题

  • 来自 `service | 的意外结果 grep`

  • 读取带有单词的文本文件及其出现次数和排序的打印输出

  • 命令 ls | grep 只显示目录(当它也应该显示文件时)

  • grep 什么时候计数,什么时候不计数

  • grep --line-buffered 直到 X 行?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve