我正在尝试将sed中的HDD ID剪切为仅包含驱动器的序列号。 ID看起来像:
t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116
所以,我只想保留“WD2DWMC4N2575116”。序列号不是固定长度所以我试图保留最后一个字符,直到出现第一个“_”。不幸的是我在RegExp吮吸:(
答案 0 :(得分:2)
使用反向引用捕获最后_
之后的所有字符:
$ sed 's/.*_\(.*\)/\1/' <<< "t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116"
WD2DWMC4N2575116
或者正如评论中所指出的那样,您可以删除从该行开始到最后_
的所有字符:
sed 's/.*_//' file
答案 1 :(得分:0)
echo "t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116" | rev | awk -F '_' '{print $1}' | rev
仅当ID在最后时才有效。
答案 2 :(得分:0)
awk中的另一个,这次是使用sub
:
数据:
$ cat file
t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116
代码+结果:
$ awk 'sub(/^.*_/,"")' file
WD2DWMC4N2575116
即。替换从第一个字符到最后一个字符_
的所有内容。当sub
返回所做的替换次数时,该值用于触发隐式输出。如果您要处理多个记录而不是所有记录都有_
个,请在||1
之后添加sub
:
$ cat foo >> file
$ awk 'sub(/^.*_/,"") || 1' file
WD2DWMC4N2575116
foo