我有 MD5 文件,其中列出了文件名和 MD5 总和,如下所示:
MD5 (file14n0001.xml.gz) = 04eb2524d271077ec8f1a0021779b171
MD5 (file14n0002.xml.gz) = 07e2b29645e9211cce9daf1ae27e7b99
MD5 (file14n0003.xml.gz) = c31cca187a32743441868822b02d83aa
我只需要解析出文件名和MD5总和;例如,所需的输出是:
file14n0001.xml.gz 04eb2524d271077ec8f1a0021779b171
file14n0002.xml.gz 07e2b29645e9211cce9daf1ae27e7b99
file14n0003.xml.gz c31cca187a32743441868822b02d83aa
我的 tr (用 sed 增强)表达式是:
tr -d 'MD5() ' | sed 's/=/ /g'
但表达式的 tr 部分也会删除行中的所有 5,因此输出为
file14n0001.xml.gz 04eb224d271077ec8f1a0021779b171
file14n0002.xml.gz 07e2b2964e9211cce9daf1ae27e7b99
file14n0003.xml.gz c31cca187a32743441868822b02d83aa
我恳请您指点如何继续。
答案1
命令:
sed -r 's/MD5 .(.*). = (.*)/\1 \2/' filename
输出:
file14n0001.xml.gz 04eb2524d271077ec8f1a0021779b171
file14n0002.xml.gz 07e2b29645e9211cce9daf1ae27e7b99
file14n0003.xml.gz c31cca187a32743441868822b02d83aa
答案2
不使用tr
,只使用sed
。
sed -r -e 's/^MD5 [(](.+)[)] = ([0-9a-f]+)$/\1 \2/g'
答案3
对于小文件,可以选择纯 bash 解决方案
while IFS='() ' read -r _ file_name _ sum;
do
printf '%s %s\n' "$file_name" "$sum";
done < file
file14n0001.xml.gz 04eb2524d271077ec8f1a0021779b171
file14n0002.xml.gz 07e2b29645e9211cce9daf1ae27e7b99
file14n0003.xml.gz c31cca187a32743441868822b02d83aa
答案4
假设列数是固定的awk
并且sed
是有用的。
awk '{print $2,$4}' file.txt | sed 's@[()]@@g'
foo@bar(~) $ awk '{print $2,$4}' file.txt | sed 's@[()]@@g'
file14n0001.xml.gz 04eb2524d271077ec8f1a0021779b171
file14n0002.xml.gz 07e2b29645e9211cce9daf1ae27e7b99
file14n0003.xml.gz c31cca187a32743441868822b02d83aa
排序总结:获取您想要的列awk
并删除()
符号