在没有正则表达式的情况下在多个文件中搜索一个字符串?

tog22

是否有一个命令可以在多个文件中搜索一个字符串,而该命令(可能由某个选项修改)不支持正则表达式?我希望这样可以避免正则表达式的速度,而且不必转义特殊字符。

(也很高兴知道在目录及其子目录中递归搜索的选项。)

斯蒂芬·查泽拉斯

如果文件是文本文件和字符串不包含换行符,您可以使用grep-F(用于固定字符串)选项。

string='any /text\ *string* without newline (\n).'
find . -type f -exec grep -F -l -e "$string" {} +

列出包含包含该字符串的行的文本文件。

(此处限制为符号链接解析之前的常规文件)

一些grep实现也可以处理非文本文件(比如那些包含 NUL、字节、带有超长行或字节序列的文件,或者在您的语言环境中形成有效字符的文件)。有些人也可以find使用-r, -R,-d recurse选项完成工作尽管在处理非常规文件或在下降目录树时是否遵循目录的符号链接时,行为会有所不同。

通过 的busybox实现grep,您可以使用选项使其处理包含换行符的文本字符串-z-z是使用以 NUL 分隔的记录而不是行,但根据定义,文本文件不能包含 NUL,无论如何您不能将 NUL 作为参数传递给命令或(除了 in zsh)将它们存储在 shell 变量中,例如$string.

所以:

string='1
2
3'
busybox grep -raFlze "$string" .

适用于任何输入的任意字符串。但是请注意busybox grep -r(至少当前版本),查看任何类型的文件,包括符号链接、设备......所以你可能想要使用它find而不是它-r来限制到常规文件:

find . -type f -exec grep -aFlze "$string" {} +

(某些find实现还可以符号链接解析-xtype f检查文件类型,以在符号链接内搜索到常规文件)。

如果输入文件不包含 NUL 字节,则意味着每个文件最终都会被整个加载到内存中,因此它不能很好地扩展到非常大的文件。

对于可能包含 NUL 的任意数据和任何大小的文件,您可以存储字符串以在文件中搜索并用于mmap()避免加载内存中已满的文件。有了perl你可以这样做:

needle_file=needle.bin # containing the string to search
size=$(wc -c < "$needle_file")

find . -type f -size "+$(( size - 1 ))c" -exec perl -MSys::Mmap -le '
  $needle = shift;
  open NEEDLE, "<", $needle or die "$needle: $!\n";
  mmap($needle, 0, PROT_READ, MAP_SHARED, NEEDLE);
  for (@ARGV) {
    if (open HAYSTACK, "<", $_) {
      mmap($haystack, 0, PROT_READ, MAP_SHARED, HAYSTACK);
      print if index($haystack, $needle) >= 0
    } else {
      warn "$_: $!\n"
    }
  }' -- "$needle_file" {} +

(请注意,Sys::Mmap它不是perl的核心模块之一,您可能必须像从libsys-mmap-perlDebian 上的软件包一样安装它)。

我不知道perlindex()子字符串搜索算法在查找子字符串方面的效率如何

zsh 可以将 NUL 存储在其变量中,并且可以将文件的内容映射到变量,因此您可以执行以下操作:

zmodload zsh/mapfile
set +o multibyte
string=$'foo\nbar\0baz'
print -rC1 -- **/*(ND.L+$(($#string - 1))e['[[ $mapfile[$REPLY] = *$string* ]]'])

但请注意,虽然zsh确实mmap()在下面使用,但它最终也会将文件内容复制到内存中,而且它是一个 shell,我怀疑它是否已被优化到与perl.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式多个元素一个字符串

来自分类Dev

创建正则表达式以仅在包含一个字符串而排除另一个字符串的情况下查找整个单词

来自分类Dev

正则表达式匹配字符串,长度为3-6个字符,至少一个字母,没有重复的“-”

来自分类Dev

正则表达式匹配行与字符串 AND 没有另一个字符串

来自分类Dev

正则表达式以匹配多个字符串之一,然后是另一个字符串

来自分类Dev

正则表达式匹配字符串中的最后一个字符 - C#

来自分类Dev

如何使用正则表达式从另一个字符串的开头删除多个字符串

来自分类Dev

如何从 Python 中的正则表达式中只提取一个字符串?

来自分类Dev

正则表达式:引号中的最后一个字符串

来自分类Dev

如何只拒绝正则表达式模式中的一个字符串

来自分类Dev

正则表达式替换字符串中除一个字符外的所有字符

来自分类Dev

正则表达式从一个字符串到另一个字符串

来自分类Dev

使用另一个字符串中的部分正则表达式和部分非正则表达式搜索文本进行搜索

来自分类Dev

如何用正则表达式匹配字符串中的一个或多个字符?

来自分类Dev

一个正则表达式,用于搜索包含一个字符串但不包含另一个字符串的行

来自分类Dev

R:在一个字符串中匹配M个正则表达式后提取N个字符

来自分类Dev

正则表达式似乎将一个字符串视为多个子字符串

来自分类Dev

如何检查一个字符串在GNU正则表达式中是否包含几个字符?

来自分类Dev

正则表达式-查找行中的字符串,但替换同一行中的另一个字符串

来自分类Dev

如何使用正则表达式按最后一个字符拆分字符串?

来自分类Dev

正则表达式匹配不包括第一个字符的字符串

来自分类Dev

正则表达式-回显字符串的第一个字符

来自分类Dev

在正则表达式中选择子字符串的最后一个字符

来自分类Dev

Python 3-正则表达式-匹配少一个字符的字符串

来自分类Dev

使用正则表达式替换匹配字符串的最后一个字符

来自分类Dev

R:从第一个字符到字符串末尾的正则表达式

来自分类Dev

在文本文件中找到一个字符串,然后将其放入带有正则表达式的另一个文件中

来自分类Dev

在文本文件中找到一个字符串,然后将其放入带有正则表达式的另一个文件中

来自分类Dev

在没有正则表达式的情况下找到一个浮点形式的字符串python

Related 相关文章

  1. 1

    正则表达式多个元素一个字符串

  2. 2

    创建正则表达式以仅在包含一个字符串而排除另一个字符串的情况下查找整个单词

  3. 3

    正则表达式匹配字符串,长度为3-6个字符,至少一个字母,没有重复的“-”

  4. 4

    正则表达式匹配行与字符串 AND 没有另一个字符串

  5. 5

    正则表达式以匹配多个字符串之一,然后是另一个字符串

  6. 6

    正则表达式匹配字符串中的最后一个字符 - C#

  7. 7

    如何使用正则表达式从另一个字符串的开头删除多个字符串

  8. 8

    如何从 Python 中的正则表达式中只提取一个字符串?

  9. 9

    正则表达式:引号中的最后一个字符串

  10. 10

    如何只拒绝正则表达式模式中的一个字符串

  11. 11

    正则表达式替换字符串中除一个字符外的所有字符

  12. 12

    正则表达式从一个字符串到另一个字符串

  13. 13

    使用另一个字符串中的部分正则表达式和部分非正则表达式搜索文本进行搜索

  14. 14

    如何用正则表达式匹配字符串中的一个或多个字符?

  15. 15

    一个正则表达式,用于搜索包含一个字符串但不包含另一个字符串的行

  16. 16

    R:在一个字符串中匹配M个正则表达式后提取N个字符

  17. 17

    正则表达式似乎将一个字符串视为多个子字符串

  18. 18

    如何检查一个字符串在GNU正则表达式中是否包含几个字符?

  19. 19

    正则表达式-查找行中的字符串,但替换同一行中的另一个字符串

  20. 20

    如何使用正则表达式按最后一个字符拆分字符串?

  21. 21

    正则表达式匹配不包括第一个字符的字符串

  22. 22

    正则表达式-回显字符串的第一个字符

  23. 23

    在正则表达式中选择子字符串的最后一个字符

  24. 24

    Python 3-正则表达式-匹配少一个字符的字符串

  25. 25

    使用正则表达式替换匹配字符串的最后一个字符

  26. 26

    R:从第一个字符到字符串末尾的正则表达式

  27. 27

    在文本文件中找到一个字符串,然后将其放入带有正则表达式的另一个文件中

  28. 28

    在文本文件中找到一个字符串,然后将其放入带有正则表达式的另一个文件中

  29. 29

    在没有正则表达式的情况下找到一个浮点形式的字符串python

热门标签

归档