[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[已解决]sed倒序/反转字符串的疑问

本帖最后由 zhanglei1371 于 2017-8-8 06:37 编辑

以下代码可将ABCD变为DCBA,看了半天,不太理解,求解释。
  1. sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//" a.txt
复制代码
尤其是//D的用法,能看出是循环的作用,但是前面两个斜杠作用时什么?为什么不直接写为D?

百度找到了解释,分享学习一;
 需求:将 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

TOP

1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# zhanglei1371

批处理的反序,我也研究了半天。还是不得要领吧。

TOP

返回列表