我目前正在使用 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/*
以上的意思是