“调整”tr 和 sed 表达式

“调整”tr 和 sed 表达式

我有 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并删除()符号

相关内容