sed将文本移到行首?

时间:2010-01-02 04:42:35

标签: bash sed

我有一个内容为“eth0 eth1 bond0”的变量,有没有办法使用sed或类似的工具将匹配bond.*的任何内容移动到行的开头?

3 个答案:

答案 0 :(得分:4)

只使用Bash:

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

修改

此版本在字符串中的任何位置处理多次出现的“bond”:

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版本,特定于字符串“bond”后跟一个或多个数字,而不是允许任何以“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

答案 1 :(得分: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

答案 2 :(得分:0)

这可能对您有用:

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

这可以通过移动不以b开头的单词来起作用。