将 grep 与包含要扩展的变量的模式一起使用

Dus*_*yte 3 grep bash shell-script

我在表格上有一个文件

2e95d7582c53583fa8afb54e0fe7a2597c92cbba 1461065389 52880 temp/hello/file.txt
46c897a7aa8a641f46080b3431860bd0cd4a8f05 1461066221 207 temp/Another file.txt
83c8ce6b163ec1c615617fa0dbde9e928bc3daf4 1461056193 86112 Pictures/a photo.jpg
...
Run Code Online (Sandbox Code Playgroud)

也就是说,每一行都有一个 40 个字符长的十六进制数字,后跟空格、整数、空格、整数、空格和可能包含空格的文件路径。每条路径都是独一无二的。

在 bash 脚本中,我有与文件中一行相同形式的变量,只是没有第一个十六进制字符串和空格(前 41 个字符),例如:

myvar="1461066221 207 temp/Another file.txt"
Run Code Online (Sandbox Code Playgroud)

我的目标是在文件中找到忽略前 41 个字符时myvar 完全匹配行。如果找到这样的匹配,我希望将变量line设置为文件中的整行。对于上面的示例,line将设置为

46c897a7aa8a641f46080b3431860bd0cd4a8f05 1461066221 207 temp/Another file.txt
Run Code Online (Sandbox Code Playgroud)

如果没有这样的匹配,line应该设置为空字符串,或者不设置。

我的解决方案是这样的(filelist是文件名):

line=$(grep --color=never -E "^.{41}$myvar$" $filelist)
Run Code Online (Sandbox Code Playgroud)

一个问题是,在$myvar展开时它可能包含特殊符号,如., +, even^$等,这些符号对 具有特殊含义grep。我想grep对一行的前 41 个字符以外的所有字符执行完全匹配myvar

cho*_*oba 6

Perl 来救援!

perl -ne 'BEGIN { $search = shift }
          print if /^.{41}\Q$search\E$/;
         ' -- "$myvar" "$filelist"
Run Code Online (Sandbox Code Playgroud)
  • -n 逐行读取文件。
  • BEGIN 块将第一个参数中的 $myvar 检索到 Perl 变量 $search 中。
  • \Q...\E引用内部部分(参见quotemeta)。这将处理变量可以包含的所有特殊字符。不要忘记双引号 shell 变量!

  • @DustByte:您的生活可能会轻松得多;-) 不要听那些仇恨者的意见,使用正确的工具来完成工作! (3认同)