字符串反向Linux,[已解决]sed倒序/反转字符串的疑问 - UNIX/Linux Shell - 批处理之家 批处理_BAT脚本_PowerShell_VBS_CMD_DOS_Perl_Pyt...

百度找到了解释,分享学习一;

需求:将 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 !\n

模式空间第二部分:null

执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”

模式空间第一部分:I love linux !\n

模式空间第二部分:love linux !\nI

模式空间第三部分:null

执行 ”//D; “//匹配空行执行D删除模式空间第一部分

模式空间第一部分:love linux !\nI

模式空间第二部分:null

因为还有内容,返回前面命令

第二次"/\n/!G;"有\n不执行,内容不变

模式空间第一部分:love linux !\nI

模式空间第二部分:null

执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”

模式空间第一部分:love linux !\n

模式空间第二部分:linux !\nlove I

模式空间第三部分:null

执行 ”//D; “//匹配空行执行D删除最上一行

模式空间第一部分:linux !\nlove I

模式空间第二部分:null

因为还有内容,返回前面命令

第三次"/\n/!G;"有\n不知行,内容不变

模式空间第一部分:linux !\nlove I

模式空间第二部分:null

执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”

模式空间第一部分:linux !\n

模式空间第二部分:!\nlinux love I

模式空间第三部分:null

执行 ”//D;“ //匹配空行执行D删除最上一行

模式空间第一部分:!\nlinux love I

模式空间第二部分:null

因为还有内容,返回前面命令

第四次"/\n/!G;"有\n不知行,内容不变

模式空间第一部分:!\nlinux love I

模式空间第二部分:null执行后面的替换 “s/\([^ ]* \)\(.*\n\)/&\2\1/;” 因为!后面没有空格所以不匹配,不执行

模式空间第一部分:!\nlinux love I

模式空间第二部分:null执行 ”//D;“ //匹配空行执行D删除最上一行

模式空间:null

此时模式空间中为空结束循环,此时若没有 ”s/\n/ / “则应该打印

!\nlinux love I

因为有”s/\n/ / “,所以再此处将!\nlinux love I作为”s/\n/ / “的输入内容,执行替换,最后结果

! linux love I

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值