shell 着色文本中的特定字符串

ftf50wuq  于 2023-01-17  发布在  Shell
关注(0)|答案(2)|浏览(141)

我想在输出文本文件时突出显示一些字符串。例如文字[2]quicklazy在:

... => any number of lines with non-matching content
He’s quick but lazy.
...
• The future belongs to those who believe in the beauty of their dreams [2].
...
I’m lazy but quick (2 times faster); is there a difference when "lazy" comes before "quick"?
...

我的直观方法是使用grep进行着色(事实上,我没有固定使用任何特定的工具):

grep -F -e '[2]' -e 'quick' -e 'lazy' --color file.txt

但它有两个问题:
1.它过滤掉不匹配的行,而我想把它们包含在输出中。
1.它不会突出显示所有匹配的字符串;看起来-e表达式的提供顺序很重要edit(注意BSD grep)。
我的预期输出(<...>代表彩色化)为:

... => any number of lines with non-matching content
He’s <quick> but <lazy>.
...
• The future belongs to those who believe in the beauty of their dreams <[2]>.
...
I’m <lazy> but <quick> (2 times faster); is there a difference when "<lazy>" comes before "<quick>"?
...
pvabu6sv

pvabu6sv1#

grep -n -F -e '[2]' -e 'quick' -e 'lazy' --color=always file.txt |
awk -F':' '
    FILENAME==ARGV[1] { n=substr($1,9,length($1)-22); sub(/[^:]+:/,""); a[n]=$0; next }
    { print (FNR in a ? a[FNR] : $0) }
' - file.txt

将使用grep查找并突出显示字符串,然后awk将打印这些行的grep输出以及输入文件中的原始行。

o4hqfura

o4hqfura2#

更新

我发现了一种使用grep -E代替grep -F的方法。作为一个副作用,匹配一个literal字符串将需要它的ERE转义
方法是构建一个由搜索字符串的并集加上一个额外的$锚(用于选择“不匹配”的行)组成的正则表达式。
因此,要突出显示示例文本中的文字[2]quicklazy,可以用途:

grep -E '\[2]|quick|lazy|$' --color file.txt

编辑:我将^锚点替换为$锚点,因为在macOS上:

  • grep -E '\[2]|quick|lazy|^' --color不突出显示任何单词
  • grep -E -e '\[2]|quick|lazy' -e '^' --color分段故障...

相关问题