2010-01-02 39 views
2

我有一個變量的內容「eth0 eth1 bond0」,有沒有一種方法使用sed或類似的工具來移動任何匹配bond.*到行的開頭的東西?Sed將文本移至行首?

回答

4

使用無非擊:

$ var="eth0 eth1 bond0" 
$ [[ $var =~ (.*)\ (bond.*) ]] 
$ var="${BASH_REMATCH[2]} ${BASH_REMATCH[1]}" 
$ echo "$var" 
bond0 eth0 eth1 

編輯:

這個版本處理 「保函」 的字符串中的任意位置多次出現:

var="eth0 bond0 eth1 bond1 eth2 bond2" 
for word in $var 
do 
    if [[ $word =~ bond ]] 
    then 
     begin+="$word " 
    else 
     end+="$word " 
    fi 
done 
var="$begin$end" 
var="${var%* }" # if you need to strip the trailing space 
echo "$var" 

輸出:

bond0 bond1 bond2 eth0 eth1 eth2 

編輯2:

這裏是一個sed版本是特定的字符串「債券」後面跟着一個或多個數字,而不是允許以「B」開頭的單詞:

$ echo "eth0 bond0 eth1 bond1 eth2 bond2" | 
sed 's/\<bond[[:digit:]]\+/\n&\n/g; s/ //g; :a; s/\(.*\)\n\(bond[[:digit:]]\+\)/\2 \1/;ta; s/\n/ /g' 
bond0 bond1 bond2 eth0 eth1 eth2 
+0

謝謝你,這兩種情況都涵蓋了,單個和多個債券實例很有用。* :) – f10bit 2010-01-02 12:43:01

3

你還可以使用AWK

echo "eth0 bond1 eth1 bond0 eth2 bond2" | awk '{ 
    for(i=1;i<=NF;i++) 
     if($i~/bond/){a[++d]=$i} 
     else{b[++e]=$i} 
}END{ 
    for(i=1;i<=d;i++){ 
     printf a[i]" " 
    } 
    for(i=1;i<=e;i++){ 
     printf b[i]" " 
    } 
}' 

輸出

$ ./shell.sh 
bond1 bond0 bond2 eth0 eth1 eth2 
0

這可能會爲你工作:

echo "eth0 bond0 eth1 bond1 eth2 bond2" | sed ':a;s/\<\([^b]*\) \(b.*\)/\2 \1/g;ta' 
bond0 bond1 bond2 eth0 eth1 eth2 

該作品以感人的語言不b begining那些文字背後。