grep能否只显示符合搜索模式的单词?
有没有办法让grep从匹配搜索表达式的文件中输出“单词” 如果我想在多个文件中查找所有实例,例如“th”,我可以执行以下操作:grep能否只显示符合搜索模式的单词?,grep,words,Grep,Words,有没有办法让grep从匹配搜索表达式的文件中输出“单词” 如果我想在多个文件中查找所有实例,例如“th”,我可以执行以下操作: grep "th" * 但输出将类似(我用粗体) 这可以使用grep吗?或者使用其他工具组合?只需awk,无需工具组合 # awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file the the the this thoroughly #awk'{for(i=1;iTrygrep-o: grep -oh
grep "th" *
但输出将类似(我用粗体)
这可以使用grep吗?或者使用其他工具组合?只需
awk
,无需工具组合
# awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file
the
the
the
this
thoroughly
#awk'{for(i=1;iTrygrep-o
:
grep -oh "\w*th\w*" *
编辑:匹配菲尔的评论
发件人:
您可以通过以下方式将grep输出导入Perl:
grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}'
您可以将空格转换为换行符,然后使用grep,例如:
cat * | tr ' ' '\n' | grep th
您也可以尝试pcregremp。在grep中还有一个-w
选项,但在某些情况下,它不能按预期工作
发件人:
我对awk难以记忆的语法感到不满意,但我喜欢使用一个实用程序来实现这一点
看起来ack(如果您使用Ubuntu,则为ack grep)可以轻松做到这一点:
# ack-grep -ho "\bth.*?\b" *
the
the
the
this
thoroughly
如果省略-h标志,则会得到:
# ack-grep -o "\bth.*?\b" *
some-other-text-file
1:the
some-text-file
1:the
the
yet-another-text-file
1:this
thoroughly
作为奖励,您可以使用--output
标志来执行更复杂的搜索,使用我找到的最简单的语法:
# echo "bug: 1, id: 5, time: 12/27/2010" > test-file
# ack-grep -ho "bug: (\d*), id: (\d*), time: (.*)" --output '$1, $2, $3' test-file
1, 5, 12/27/2010
摘自grep手册页:
-w:仅选择包含构成整词的匹配项的行。测试是,匹配的子字符串必须位于行的开头,或者前面有一个非单词组成字符。grep命令仅用于匹配和perl
grep -o -P 'th.*? ' filename
我有一个类似的问题,寻找grep/pattern regex和“找到的匹配模式”作为输出
最后,我使用了带有选项-o的egrep(grep-e或-G上相同的正则表达式没有给我相同的egrep结果)
因此,我认为这可能类似于(我不是正则表达式大师):
交叉分发安全答案(包括windows minGW?
如果您使用的是不包含-o选项的较旧版本的grep(如2.4.2),请使用上面的版本。否则,请使用下面更简单的维护版本
Linux交叉分发安全答案
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
总之:-oh
输出与文件内容匹配的正则表达式(而不是其文件名),就像您希望正则表达式在vim/etc中工作一样。您将搜索什么单词或正则表达式,这取决于您自己!只要您使用POSIX而不是perl语法(请参阅下文)
-o打印每个匹配项,但仅打印匹配项,而不是整行。
-h不得使用输出行打印文件名标题(即文件名)。
-w表达式作为单词搜索(好像被
`[[:要搜索以“icon-”开头的所有单词,下面的命令非常有效。我在这里使用的命令与grep类似,但具有更好的选项和良好的格式
ack -oh --type=html "\w*icon-\w*" | sort | uniq
这比你想象的要简单。试试这个:
egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)
egrep -iwo 'th.[a-z]*' filename.txt ### (Case Insensitive)
其中,
egrep: Grep will work with extended regular expression.
w : Matches only word/words instead of substring.
o : Display only matched pattern instead of whole line.
i : If u want to ignore case sensitivity.
下面是使用ripgrep
的示例:
rg -o "(\w+)?th(\w+)?"
它将匹配所有匹配th
但不会给出正确结果的单词。此外,如果使用Perl,则无需使用grep。使用Perl完成所有操作。感谢您指出错误,ghostdog74。我已将其更改为打印行中的所有单词,而不仅仅是第一个。如我所说,grep不是必需的。Perl-n-e'while(/(\s+th\w*)/g){print“$1\n”}文件由您决定。我只是说明一点。如果没有必要,请不要这样做。额外的“|”将使您多花费一个进程。在Perl 5.10或更高版本中:Perl-nE'@a=/(regexp)/ig;说join“\n”,@a'no'need cat.tr''\n'tr
,他可以先执行grep
,因此tr
将只应用于匹配的行:grep th filename | tr'\n'| grep th
,仍将打印整个line包含匹配项。它约束实际匹配项,使不再匹配,例如“this”或“bathe”@user181548,grep-o选项仅适用于GNU grep。因此,如果您不使用GNU grep,它可能不适用于您。@A-B-B这取决于您是否要显示匹配文件的名称。我不确定在什么情况下它会显示和不会显示,但我知道,当我在多个目录中使用grep时,它确实会显示full file path表示所有匹配的文件,而-h只显示匹配的单词,没有任何关于它是哪个文件的说明。因此,要匹配原始问题,我认为在某些情况下是必要的。我需要解释一下“\w*th\w*”*
的意思,所以我想我应该发布。\w
是[\u[:alnum:],因此它基本上匹配任何包含“th”的“word”(因为\w
不包括空格)。引用部分后面的*是一个glob,其中文件(即匹配此目录中的所有文件)\w
通常不可移植到grep-e
;为了正确的移植性,请使用POSIX字符类名[:alnum:]
相反(或者如果你真的想要下划线,也可以试试[[uu[:alnum:]]
;或者如果你的平台有下划线,可以试试grep-P
。@A-B-B如果OP显示了所需的输出,-h
,我会说……那么-o只在GNU grep中工作怎么办(正如ksinkar在接受答案的评论中提到的那样)“?@Brilliand-hmm,我很难找到一个没有
grep -o -P 'th.*? ' filename
egrep -o "the*|this{1}|thoroughly{1}" filename
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
ack -oh --type=html "\w*icon-\w*" | sort | uniq
egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)
egrep -iwo 'th.[a-z]*' filename.txt ### (Case Insensitive)
egrep: Grep will work with extended regular expression.
w : Matches only word/words instead of substring.
o : Display only matched pattern instead of whole line.
i : If u want to ignore case sensitivity.
rg -o "(\w+)?th(\w+)?"