Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个文件中查找多个模式bash_Bash - Fatal编程技术网

在多个文件中查找多个模式bash

在多个文件中查找多个模式bash,bash,Bash,我试图在多个不同的文件中找到多个模式(我有一个模式文件),其中包含很多子文件。 我试图使用退出代码来不输出所有找到的模式(因为我只需要那些没有找到的模式),但是退出代码在我理解它们时不起作用 while read pattern; do grep -q -n -r $pattern ./dir/ if [ $? -eq 0 ]; then : #echo $pattern ' exists' else echo $pattern " doesn't exist"

我试图在多个不同的文件中找到多个模式(我有一个模式文件),其中包含很多子文件。 我试图使用退出代码来不输出所有找到的模式(因为我只需要那些没有找到的模式),但是退出代码在我理解它们时不起作用

while read pattern; do
  grep -q -n -r $pattern ./dir/
  if [ $? -eq 0 ]; then
    : #echo $pattern ' exists'
  else
    echo $pattern " doesn't exist"
  fi
done <strings.tmp
读取模式时;做
grep-q-n-r$pattern./dir/
如果[$?-等式0];然后
:#echo$模式“存在”
其他的
echo$模式“不存在”
fi

完成您可以在bash中使用此选项:

while read -r pattern; do
  grep -F -q -r "$pattern" ./dir/ || echo $pattern " doesn't exist"
done < strings.tmp
读取-r模式时的
;做
grep-F-q-r“$pattern”。/dir/| | echo$pattern“不存在”
done
  • 使用
    read-r
    安全地读取正则表达式模式
  • “$pattern”
    中使用引号以避免shell转义
  • 无需使用
    -n
    ,因为您正在使用
    -q
    (安静)标志

    • @anubhava的解决方案应该有效。如果出于某种原因没有,请尝试以下方法

      while read -r pattern; do
       lines=`grep -q -r "$pattern" ./dir/ | wc -l`
       if [ $lines -eq 0 ]; then
          echo $pattern " doesn't exist"
       else
          echo $pattern "exists"
       fi
      done < strings.tmp
      
      读取-r模式时的
      ;做
      行=`grep-q-r“$pattern”。/dir/| wc-l`
      如果[$行-等式0];然后
      echo$模式“不存在”
      其他的
      echo$模式“存在”
      fi
      done
      显示文件
      strings.tmp的示例将非常有用。您正在尝试匹配正则表达式模式还是固定字符串?代码到底是如何不起作用的?请编辑您的问题以提供这些详细信息。是的,thx,命令本身工作,但不在循环中工作。我的意思是,当我使用不存在的模式并检查它时,它是可以的,但是在循环中检查它是不起作用的。没有理由不在循环中工作。显示
      strings.tmp
      in question.test.hello test2.world的内容以及每行上的类似字符串OK,我发现问题在于字符串中的点,这些点被解释为一个特殊的regexp符号。刚刚为此添加了-F标志