我想找到至少有3个单词的所有行""。
我知道如何使用正则表达式找到这些行:
grep -E "(the)(\s(.+)\s\1){2,}" file.txt
它有效,grep找到这样的线条。但我的问题是:是否有可能只突出单词""而不是第一个和最后一个""?
之间的整个文本换句话说,我不想找到所有"""文本中的单词,但只有那些至少有3""并仅突出显示这些词语以使其更具可读性。
我试图使用https://www.regular-expressions.info/refadv.html中的内容
比如(?=)
,但它不起作用:
grep -E "(the)((?=\s(.+)\s)\1){2,}" file.txt
文本:
the cat in the garden there was the cat in the box there is the cat and the dog and the bird aaa the bbb the ccc the ddd
当前输出:
in the box there is the cat and the dog and the bird aaa the bbb the ccc the ddd
理想的输出:
in the box there is the cat and the dog and the bird aaa the bbb the ccc the ddd
答案 0 :(得分:3)
你可以将一个grep传递给另一个:
<!-- Correct -->
$('#totalNumber')
document.getElementById('totalNumber')
<span id="totalNumber">...</span>
<!-- Incorrect -->
document.getElementById('#totalNumber')
<span id="#totalNumber">...</span>
<强>输出:强>
在 框中有 猫和 狗和 鸟 aaa bbb ccc ddd`
第一个grep -E '(\bthe\b.*?){3}' file | grep --color '\bthe\b'
找到包含至少3个完整单词grep
和第2个the
的所有行,只为每个grep
单词添加颜色。
答案 1 :(得分:0)
这是一个awk,它计算每一行的单词,并将计数为三或更多的单词加粗:
$ awk '
BEGIN {
b="\033[1m"
n="\033[0m"
}
{
delete a
for(i=1;i<=NF;i++)
# if(lenght($i)==3) # uncomment this to consider three-letter words only
a[$i]++
for(i=1;i<=NF;i++)
printf "%s%s%s%s",(a[$i]>=3?b:""),$i,(a[$i]>=3?n:""),$i==NF?ORS:OFS)
}' file
猫在花园里有猫 在 框中有 猫和 狗和 鸟 aaa bbb ccc ddd
如果您只想考虑三个字母的字词,请在if(length($i)==3)
之前添加a[$i]++
。
修改强>
我错过了只打印粗体线的部分。现在修好了:
$ awk '
BEGIN {
b="\033[1m"
n="\033[0m"
}
{
for(i=1;i<=NF;i++)
if(length($i)==3)
a[$i]++
for(i=1;i<=NF;i++)
buf=buf (i>1?OFS:"") (a[$i]>=3&&(f=1)?b:"") $i (a[$i]>=3?n:"")
if(f)
print buf
delete a; buf=""; f=""
}' file
在 框中有 猫和 狗和 鸟 aaa bbb ccc ddd