Regex 正则表达式仅在未找到完全匹配的情况下匹配复数

Regex 正则表达式仅在未找到完全匹配的情况下匹配复数,regex,bash,grep,Regex,Bash,Grep,我需要一点帮助来弄清楚正则表达式。给定文件中的单词列表: Peril Is I Non No 我试图找到一个正则表达式,如果需要,它将匹配复数,但只有在没有其他匹配可用时。我现在所拥有的: #!/bin/bash findword(){ grep -iE "^$@?" file } 如果我像findword-periors那样运行它,它将返回perior。这就是我想要发生的 但是如果我像findwordnon那样运行它,它会同时匹配non和No。 与findword is相同匹配is和I

我需要一点帮助来弄清楚正则表达式。给定文件中的单词列表:

Peril
Is
I
Non
No
我试图找到一个正则表达式,如果需要,它将匹配复数,但只有在没有其他匹配可用时。我现在所拥有的:

#!/bin/bash
findword(){
  grep -iE "^$@?" file
}
如果我像
findword-periors
那样运行它,它将返回
perior
。这就是我想要发生的

但是如果我像
findwordnon
那样运行它,它会同时匹配
non
No
。 与
findword is相同
匹配
is
I
。这不是我想要的。如果在列表中找不到精确匹配,我只需要非精确匹配

$ cat file 
Peril
Is
I
Non
No

$ findword(){ grep -ix "$1" file || grep -ix "${1::-1}" file; }
$ findword no
No
$ findword non
Non
$ findword none
Non
$ findword i
I
$ findword is
Is
  • -x
    仅强制整行匹配
  • grep-ix“$1”文件
    如果找到匹配项,将打印该文件,退出状态将为
    0
  • 否则,
    |
    之后的命令将开始播放
  • grep-ix“${1::-1}”文件
    删除最后一个字符后再次检查
    • 也可以使用
      grep-ixE“$1?”文件
  • 此外,可以添加
    -F
    选项,因为单词可以包含
    之类的元字符,但您希望按字面搜索
  • -x
    仅强制整行匹配
  • grep-ix“$1”文件
    如果找到匹配项,将打印该文件,退出状态将为
    0
  • 否则,
    |
    之后的命令将开始播放
  • grep-ix“${1::-1}”文件
    删除最后一个字符后再次检查
    • 也可以使用
      grep-ixE“$1?”文件
  • 此外,可以添加
    -F
    选项,因为单词可以包含
    之类的元字符,但您希望按字面搜索

我可能错了,但我认为你不能只用正则表达式来解决这个问题。按照您需要的方式,正则表达式必须搜索所有内容才能知道不存在精确匹配,然后才搜索非精确匹配。这至少需要两个循环,一个搜索精确的,另一个搜索非精确的,如果第一个找不到的话但是我仍然需要为第二个循环找出正确的正则表达式。但是您如何区分
perior
对于
periors
很好,但是
I
对于
is
不好?我可能会感到困惑,但是如果你的意思是你想要
危险
如果找到了,并且
危险
只有
危险
没有找到,那么你可以做一些类似
grep-ix“$1”文件| grep-ixE“$1?”文件的事情
我可能错了,但我认为你不能只用regex解决这个问题。按照您需要的方式,正则表达式必须搜索所有内容才能知道不存在精确匹配,然后才搜索非精确匹配。这至少需要两个循环,一个搜索精确的,另一个搜索非精确的,如果第一个找不到的话但是我仍然需要为第二个循环找出正确的正则表达式。但是您如何区分
perior
对于
periors
很好,但是
I
对于
is
不好?我可能会感到困惑,但是如果你的意思是你想要
危险
如果找到了,并且
危险
只有
危险
没有找到,那么你可以做类似
grep-ix“$1”文件| grep-ixE“$1”的事情文件
grep-x'PATTERN'
grep'^PATTERN$'相同
grep-x'PATTERN'
grep'^PATTERN$'相同