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
。
Perl 来救援!
perl -ne 'BEGIN { $search = shift }
print if /^.{41}\Q$search\E$/;
' -- "$myvar" "$filelist"
Run Code Online (Sandbox Code Playgroud)
-n
逐行读取文件。\Q...\E
引用内部部分(参见quotemeta)。这将处理变量可以包含的所有特殊字符。不要忘记双引号 shell 变量!