我正在尝试在sed中剪切HDD ID以仅包含驱动器的序列号。该 ID 如下所示:
t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116
所以,我只想保留"WD2DWMC4N2575116"。序列号不是固定长度的,所以我试图保留最后一个字符,直到出现第一个"_"。不幸的是,我在 RegExp :(
要捕获上次_
之后的所有字符,请使用反向引用:
$ sed 's/.*_(.*)/1/' <<< "t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116"
WD2DWMC4N2575116
或者如评论中所述,您可以删除从行首到最后_
的所有字符:
sed 's/.*_//' file
echo "t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116" | rev | awk -F '_' '{print $1}' | rev
仅当 ID 位于末尾时,它才有效。
另一个在awk中,这次使用sub
:
数据:
$ cat file
t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116
代码 + 结果:
$ awk 'sub(/^.*_/,"")' file
WD2DWMC4N2575116
即替换从第一个字符到最后一个_
的所有内容。由于sub
返回所做的替换数,该值用于触发隐式输出。如果要处理多个记录,但并非所有记录都有 _
条,请在sub
后添加 ||1
:
$ cat foo >> file
$ awk 'sub(/^.*_/,"") || 1' file
WD2DWMC4N2575116
foo