我正在尝试改造:
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
中正确执行正则表达式。这看起来有什么问题吗?
答案 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答案显然更容易维护。