2010-01-02 42 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那些文字背后。