return 匹配但不完全相同的字符串

return matching but not exact same strings

有什么方法可以找到包含给定字符串但不完全匹配的单词。例如

# cat t.txt
first line
ind is a shortform of india

我正在尝试 return 单词“india”,因为它包含字符串“ind”,但我不需要完全匹配。这个我试过了...

# grep -o 'ind' t.txt
ind
ind

请您尝试以下操作:

grep -Eo '[A-Za-z]+ind|ind[A-Za-z]+' t.txt

输出:

india

正则表达式 [A-Za-z]+ind|ind[A-Za-z]+ 匹配 ind,包括前面或后面的字母。

我会按照以下方式使用 GNU AWK 完成此任务,令 file.txt 内容为

first line
ind is a shortform of india

然后

awk 'BEGIN{RS="[[:space:]]+"}match([=11=],/ind/)&&length>RLENGTH{print}' file.txt

产出

india

说明:我通知GNU AWK行分隔符(RS)是一个或多个空格,这样每个单词都会被视为行。然后对于每一行(即每个单词)我使用 match 函数 which return 1 if found else 0 并设置 RSTARTRLENGTH 值。如果找到匹配项,我检查当前行(即单词)的 length 是否大于匹配项,如果是,我 print 表示单词。请注意,每个单词都在自己的行中输出,例如,如果输入文件内容为

india ind india ind india

那么输出将是

india
india
india

(在 gawk 4.2.1 中测试)

$ grep -Eo '[[:alpha:]]+ind[[:alpha:]]*|[[:alpha:]]*ind[[:alpha:]]+' file
india
fooindbar

以上是此输入文件的 运行(请注意添加的 ind 测试用例出现在字符串的中间,而不仅仅是开头或结尾):

$ cat file
first line
ind is a shortform of india
this fooindbar is the mid-word text

如果您愿意,您可以使用 GNU awk(对于 multi-char RS、RT 和 \s shorthand 对于 [[:space:]])执行相同的操作:

$ awk -v RS='\s+' '/[[:alpha:]]+ind[[:alpha:]]*|[[:alpha:]]*ind[[:alpha:]]+/' file
india
fooindbar

或:

$ awk -v RS='[[:alpha:]]+ind[[:alpha:]]*|[[:alpha:]]*ind[[:alpha:]]+' 'RT{print RT}' file
india
fooindbar