3

我正在尝试转变:

 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"

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

4

4 回答 4

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}'
于 2013-07-24T17:55:56.820 回答
2

如果您对非纯 sed 解决方案感兴趣,但更简单的解决方案,这里是一个混合 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}'
于 2013-07-24T17:58:55.443 回答
1

这是您任务的快速而肮脏的解决方案,尽管它可能无法回答您的基本问题:

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

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

于 2013-07-24T18:00:32.583 回答
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 的答案显然更容易维护。

于 2013-07-24T18:16:51.260 回答