如何使用 sed 删除除随机字符串之外的所有内容

如何使用 sed 删除除随机字符串之外的所有内容

伙计们,我遇到了问题。

我有样本数据

2021-04-15 07:47:34        629 deveon3/10d/023aad3eab0a035aef3771c9220940e200a00000000242e5_0.gt

我只需要

023aad3eab0a035aef3771c9220940e200a00000000242e5

我尝试

grep _0.gt test.txt | sed "s/.* \(.*\) \(...\)\/\(.*\)_0.gt/\1|\2|\3/g"  > test.dat

但我得到相同的输出,没有区别

我期待的是如果我有

2018-10-20 19:34:23    1668004 000/02001386c62785e42231c679c614228a04000090022ff989_0.gt
2018-10-20 21:18:58    1694936 000/02001386c62785e72231c679c614228a040000000232d761_0.gt
2018-10-20 23:59:40    1828575 000/020057386c6278e72231c679c644228a04000000023696fb_0.gt

获取输出

1668004|000|02001386c62785e72231c679c614228a04000000015528dd
1694936|000|02001386c62785e72231c679c614228a040000000166bca7
1828575|000|02001386c62785e72231c679c614228a04000000022f8f33

要不就

02001386c62785e72231c679c614228a04000000015528dd
02001386c62785e72231c679c614228a040000000166bca7
02001386c62785e72231c679c614228a04000000022f8f33

我究竟做错了什么?

答案1

awk -F'[_/ ]+' '{ print $5 }' infile

awk -F'[_/ ]+' -v OFS="|" '{ print $3, $4, $5 }' infile

答案2

假设您想要每行第四个空格分隔字段中的最后一个/和第四个之间的数据:_

$ awk '{ sub(".*/","",$4); sub("_.*","",$4); print $4 }' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb

这使用sub()两次来修剪第四个字段中最后一个/字段之前和之后出现的任何内容_。然后它打印该字段的剩余内容。

使用sed替代,并假设没有其他/字符我们感兴趣的数据:

$ sed 's|.*/||; s/_.*//' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb

如果您想从第三个字段获取更多信息,并且想要将分隔符更改为|,您可以awk像这样使用:

$ awk -v OFS='|' '{ gsub("/",OFS,$4); sub("_.*","",$4); print $3,$4 }' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb

首先将/第四个字段中的所有内容更改为任何OFS内容(它是输出字段分隔符,我们|在命令行上将其设置为)。然后我们像以前一样修剪掉后面的任何内容_并打印第三个和修改后的第四个字段。

有了sed,这是可行的,尽管有点尴尬:

$ sed 's/\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{2\}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb

或使用非标准-E选项来使用扩展正则表达式:

$ sed -E 's/([^[:blank:]]+[[:blank:]]+){2}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb

这首先删除前两个字段及其后面的空格,然后删除_.最后,它将所有空格 和 更改/|

相关内容