说明:蓝色=命令名称
浅绿=命令参数
浅蓝=选项
紫色=目录
系统环境:CentOS 6.2 x86_64
需求:将 I love linux ! 反向输出 :! linux love I
方法:echo 'I love linux !' |sed '/\n/!G;s/\([^ ]* \)\(.*\n\)/&\2\1/;//D;s/\n/ /'
解析:此方法关键在 D 参数。D 删除模式空间中的第一行(确切的说应该时第一部分),如果删除后,模式空间中还有剩余行,则返回 D 之前的命令,重新执行,如果 D 后,patten space 中没有任何内容,则将退出 sed命令,将控制权交给 sed,在没有 -n 参数时,sed 会输出 pattern space 中的内容,如果最后一行没有被读入,则 sed 继续读入下一行,并去掉结尾的 \n 放到 pattern space 中,继续执行 sed 命令如果最一行已经读入,则退出 sed。
D 命令会引起循环,如果 D 被执行,那么 D 后面的命令是不会被执行的。
第一次"/\n/!G;"没有\n换行符,要执行G,因为保留空间中为空,所以在模式空间追加一空行,此时内容为
模式空间:I love linux !null\n
执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”
模式空间:I love linux !null\nlove linux !null\nI
执行 ”//D; “//匹配空行执行D删除模式空间第一部分
模式空间:love linux !null\nI
因为还有内容,返回前面命令
第二次"/\n/!G;"有\n不执行,内容不变
模式空间:love linux !null\nI
执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”
模式空间:love linux !null\nlinux !null\nlove I
执行 ”//D; “//匹配空行执行D删除模式空间第一部分
模式空间:linux !null\nlove I
因为还有内容,返回前面命令
第三次"/\n/!G;"有\n不执行,内容不变
模式空间:linux !null\nlove I
执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”
模式空间:linux !null\n!null\nlinux love I
执行 ”//D; “//匹配空行执行D删除模式空间第一部分
模式空间:!null\nlinux love I
因为还有内容,返回前面命令
第四次"/\n/!G;"有\n不执行,内容不变
模式空间:!null\nlinux love I
执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;” 因为!后面没有空格所以不匹配,不执行
模式空间:!\nlinux love I (这里匹配不到null 不知道为什么,有待研究)
执行 ”//D;没有匹配到 null
此时若没有 ”s/\n/ / “则应该打印
!\nlinux love I
因为有”s/\n/ / “,所以再此处将!\nlinux love I作为”s/\n/ / “的输入内容,执行替换,最后结果
! linux love I

















