2010-01-02 5 views

ответ

4

не используя ничего, кроме Bash:

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

Edit:

Эта версия обрабатывает несколько вхождений "связи" в любом месте в пределах строки:

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 

Edit 2:

Вот sed версия, которая является специфической для строки «связь», а затем один или более цифр, а не позволяя любое слово, которое начинается с «Ъ»:

$ 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

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]" " 
    } 
}' 

OUTPUT

$ ./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 за словами, которые делают.

Смежные вопросы