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 并设置 RSTART
和 RLENGTH
值。如果找到匹配项,我检查当前行(即单词)的 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
有什么方法可以找到包含给定字符串但不完全匹配的单词。例如
# 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 并设置 RSTART
和 RLENGTH
值。如果找到匹配项,我检查当前行(即单词)的 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