我有一个内容为“eth0 eth1 bond0”的变量,有没有办法使用sed或类似的工具将匹配bond.*
的任何内容移动到行的开头?
答案 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
开头的单词来起作用。