sed 's/\(.\)/& /g'
sed 's/\(.\)/\1 /g'
注意區別,\1必須和 \(..\)一起使用 &則不需要
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。
&
保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。
假設:
/pattern/ 爲 /abc\([0-9]*\)/
那麼匹配 fooabc123foobar 時,命中。整個正則匹配的整個字符串爲 abc123, 即 & 爲 abc123,
而第1個()子表達式所匹配的字符串爲 123, 即 \1 爲123。
-r, --regexp-extended
use extended regular expressions in the script.
實例一
[rockfall@tmp]$echo "aaa bbb "|sed -r 's/(.)/A/'
Aaa bbb
[rockfall@tmp]$echo "aaa bbb "|sed 's/(.)/A/'
aaa bbb
[rockfall@tmp]$echo "aaa bbb "|sed 's/\(.\)/A/'
Aaa bbb
Aaa bbb
[rockfall@tmp]$echo "aaa bbb "|sed 's/(.)/A/'
aaa bbb
[rockfall@tmp]$echo "aaa bbb "|sed 's/\(.\)/A/'
Aaa bbb
實例二
一文件: test.txt,內容如下:
#---------------------------------#
abc1234567890
abc0987654321
xyz1234567890
#---------------------------------#
想輸出結果:
1234567890
0987654321
1234567890
sed 命令: sed -n 's/^\([a-z]\{3\}\)\([0-9]\{3,\}\)/\2/p' test.txt 是成功的
但如果用: sed -r -n 's/^\([a-z]{3}\)\([0-9]{3,}\)/\2/p' test.txt 則提示 invalid refrence\2 on 's' commands s RHS
何解?
#---------------------------------#
abc1234567890
abc0987654321
xyz1234567890
#---------------------------------#
想輸出結果:
1234567890
0987654321
1234567890
sed 命令: sed -n 's/^\([a-z]\{3\}\)\([0-9]\{3,\}\)/\2/p' test.txt 是成功的
但如果用: sed -r -n 's/^\([a-z]{3}\)\([0-9]{3,}\)/\2/p' test.txt 則提示 invalid refrence\2 on 's' commands s RHS
何解?
你都用了-r了,還給括號前加\,當然不行了,還加\的括號就代表原義括號了
實例三
替換出常規的ip地址
[root@asmboy shell]# echo 202.038.008.090|sed 's/0\+\([0-9]\+\)/\1/g'
22.38.8.90
[root@asmboy shell]# echo 202.038.008.090|sed -r 's/0+([0-9]+)/\1/g'
22.38.8.90
22.38.8.90
[root@asmboy shell]# echo 202.038.008.090|sed -r 's/0+([0-9]+)/\1/g'
22.38.8.90
總之一句話,想少用\ 那你就用-r