Sed Regex问题

时间:2013-07-24 17:52:03

标签: regex bash sed

我正在尝试改造:

 pid 2928's current affinity list: 0-3 pid 2928's new affinity list: 0

2928: 0-3 --> 0

目前,我有以下可以正常运行的转换:

正则表达式:pid 输出:2928's current affinity list: 0-3 2928's new affinity list: 0

正则表达式:'s current affinity list 输出:2928: 0-3 2928's new affinity list: 0

然后是最终的正则表达式,它无法正常工作:

正则表达式:(\d+)(.)(.)(.)((?:[a-z][a-z]+))(\s+)((?:[a-z][a-z]+))(\s+)((?:[a-z][a-z]+))输出:2928: 0-3 2928's new affinity list: 0

正如您所看到的,它没有正确应用正则表达式。如果您在在线测试仪中测试此正则表达式,您可以看到它确实选择了正确的区域进行删除。

完整命令:

echo "pid 2928's current affinity list: 0-3 pid 2928's new affinity list: 0" | sed -e "s/pid //g" -e "s/'s current affinity list//g" -e "s/(\d+)(.)(.)(.)((?:[a-z][a-z]+))(\s+)((?:[a-z][a-z]+))(\s+)((?:[a-z][a-z]+))/-->/gim"

我不能在sed的第三个-e中正确执行正则表达式。这看起来有什么问题吗?

4 个答案:

答案 0 :(得分:3)

在这里使用awk更简单:

awk -F "[ ']" '{ print $2 ": " $7 " --> " $14}'

所有行:

echo "pid 2928's current affinity list: 0-3 pid 2928's new affinity list: 0" | awk -F "[ ']" '{ print $2 ": " $7 " --> " $14}'

答案 1 :(得分:2)

如果您对非纯粹的解决方案感兴趣,但更简单的解决方案,这里是混合的sed和awk解决方案:

echo  "pid 2928's current affinity list: 0-3 pid 2928's new affinity list: 0"|sed "s/[a-z']//g"|awk '{print $1 ": " $3 " --> " $6}'

答案 2 :(得分:1)

这是一个快速而肮脏的解决方案,虽然它可能无法解答您的基本问题:

awk '{print $2" "$6" --> "$12}' | sed 's/.s/:/'

请注意,这取决于可预测的字段2,6和12(由空格分隔)。

答案 3 :(得分:1)

问题在于您使用的是sed无法识别的perl正则表达式功能(\d\s):

sed 's/pid \([0-9]\+\)'\''s current affinity list: \([0-9]\+-[0-9]\+\) pid [0-9]\+'\''s new affinity list: /\1: \2 --> /'

awk答案显然更容易维护。