从 bash 中查找多行字符串

从 bash 中查找多行字符串

我目前正在使用 Jupyter 笔记本。借助 IDE,我过去能够查找可能位于其他位置的部分代码,从而根据需要进行重构。

假设我有以下代码:

 class.function('--parameter','-p', type = lambda x: operation(x,"%Y-%m-%d").date(),
                    default=unicode(previousTime-actualTime),
                    help='Send help'
                    )

代码是经过编辑的,并不意味着可以工作或任何东西,我只是想举例说明存在多行、多个“奇怪”字符、引号等的可能性。

我现在想看看我的代码库中存在确切的字符串。

我一直在环顾四周并阅读手册,我有类似的东西

 grep -rxno . -e "string starts
more text here %% 'parameters inside quotes'
string ends"

但我觉得因为它是一个正则表达式,所以它与我匹配的子字符串是相似的,不一定是相同的。另外,更令人困惑的是,它每行给出结果:

./DMP3K/DMP_3K.py:30:class.function(
./DMP3K/DMP_3K.py:31:    
./DICC/diccionario.py:34:                        operation(x,"%Y-%m-%d").date()

我觉得应该有一种更简单的方法来完成我所缺少的这项操作。

答案1

如果您有权访问 GNU grep(Linux 上的默认设置),则可以使用-z以下命令:

   -z, --null-data
          Treat  input  and output data as sequences of lines, each terminated by a
          zero byte (the ASCII NUL character) instead of a newline.  Like the -Z or
          --null  option,  this  option  can  be used with commands like sort -z to
          process arbitrary file names.

这将允许您指定跨越多行的模式。然后,使用-F该模式不会被解释为正则表达式:

   -F, --fixed-strings
          Interpret PATTERN  as  a  list  of  fixed  strings  (instead  of  regular
          expressions), separated by newlines, any of which is to be matched.

最后,将搜索字符串保存在变量中:

$ IFS='' read -r -d '' pat <<EoF
> class.function('--parameter','-p', type = lambda x: operation(x,"%Y-%m-%d").date(),
>                     default=unicode(previousTime-actualTime),
>                     help='Send help'
>                     )
> EoF

要运行上面的代码,首先将其写入您的终端:

IFS='' read -r -d '' pat <<EoF

然后,粘贴您要查找的行,然后写入EoF。如果搜索字符串不以新行结尾,请Enter在写入之前按EoF,因为它需要单独一行。

现在你可以grep你的文件:

grep -z "$pat" /path.to/files/*

以上的意思是

相关内容