2013-07-24 192 views
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"

我不能正確地執行正則表達式在第三-e的sed的。這看起來有什麼不對嗎?

回答

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}' 
+0

我的歉意,這實際上似乎輸出所需的輸出。我之前測試過它,它不能正常工作,但現在嘗試獲得所需的輸出。對不起,讓你心煩意亂。 –

+0

@ChristianStewart:對不起,今晚我很緊張。 –

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}' 
1

這裏有一個快速和骯髒的解決方案,你的任務,雖然它可能不回答你的理解過程依賴問題:

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

請注意,這取決於可預測的字段2,6和12(用空格分隔)。

1

的問題是,你正在使用Perl的正則表達式的功能(\d\s)不sed識別:

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

awk的答案顯然是更容易維護。