sed | awk:保持String结束,直到达到特殊字符

时间:2017-03-23 14:50:25

标签: bash awk sed

我正在尝试将sed中的HDD ID剪切为仅包含驱动器的序列号。 ID看起来像:

t10.ATA_____WDC_WD30EFRX2D68EUZN0_________________________WD2DWMC4N2575116

所以,我只想保留“WD2DWMC4N2575116”。序列号不是固定长度所以我试图保留最后一个字符,直到出现第一个“_”。不幸的是我在RegExp吮吸:(

3 个答案:

答案 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