http://www.linuxsir.org/bbs/thread57171.html

出道题考考你?

文件:
工a
式aa
工aaaa
工期aaad
工艺aaan
如何转化成:
a 工
aa 式
aaaa 工
aaad 工期
aaan 工艺

$ cat a | sed -e 's/\([a-z]*$\)/ &/' -e 's/\([^ ]*\) \([a-z]*\)/\2 \1/'

这里有两个转换步骤:
1. 转成中间用空格分隔的形式
本想直接匹配汉字和英文字符,再反转;试了试,不太好使,就曲折了一下。[a-z]*$ 匹配每行最后的所有英文字符,加上了引号表示把它作为一个“引用”来使用,这样,后面就可以用 & 来直接引述它了。
所以,'s/\([a-z]*$\)/ &/' 就是用空格+匹配到的字符来代替原来的“位于每行行尾的所有小写英文字符”。
2. 根据中间的空格做标志,把它前后的字符串位置对调
\([^ ]*\) 是匹配空格前面的所有字符,\([a-z]*\) 则匹配空格后面的小写英文字符。这里都用括号括了起来,这样后面就可以分别用 \1 和 \2 来引用他们的。把它们替换成 \2 \1 的形式自然就是对调了空格前后的字符。

$ cat myfile|sed 's/[a-z]*[a-z]/ &/g'|awk '{print $2,$1}' 

$ sed 's/[a-z]*$/ &/' test | gawk "{print \$2 \" \" \$1}"

$ sed 's/\([^[:alpha:]]*\)\([a-z]*$\)/\2 \1/' test

$ sed -e 's/^\([^a-z]*\)\([a-z]*\)$/\2 \1/g' text