linux麾下大将sed是如何仿真鼠标键盘实现换行符的替换

不知道你有没有经常使用sed , 在使用sed 进行文本编辑的时候使用s模式总是无法如愿的替换掉换行符 , 这个属实让我非常不爽,翻阅资料才知道原来是我的模式没有用对

替换换行符

  • sed 的处理是针对行的,换句话说处理单元是行内容,处理完成之后还是被回置到行内容中,所以你想要替换文本中的换行符仅仅通过上面提到的替换功能是不行的。
  • echo '1,2,3,4' | sed 's/,/\n/g' 进行模拟四行文本。后续我们看看能不能通过 s 将换行符替换回来。
  • echo '1,2,3,4' | sed 's/,/\n/g' | sed 's/\n/:/g'
  • 事实证明我们并没有将四行内容合并成一行且用 拼接没一行的内容。至于原因吗,我们一开始就说了,sed 的处理单元是行,处理写回去还是行,那么自然就会产生换行符了。那么我们该怎么解决呢?
  • sed 中提供了一种模式(追加文本流中的下一行到模式空间进行合并处理)。这种模式就是 N; 这个模式怎么理解呢?就是他会将 下一行追加到当前行(包括换行符号) ,如果我们在这种模式没有将换行符替换掉,等写回去的时候还是新站新行。所以出现如下效果。

半吊子替换了一半的换行符

  • 你可能会说那好办,我们将换行符替换掉就可以了。我想说并没有这么简单,我们先来看下直接替换后是啥效果
  • 看到了吗,他并没有将文本合并成一行,而是每两行合并成 1行输出,这是为什么呢?原因还得看 N 模式,我们上面提到 N 模式是将下一行内容追加到当前行一次性处理,sed 在处理第一行的时候第二行提出过来,处理完成之后写入第一行,光标移动到下一行继续将他的下一行读取过来处理,这就解释了为什么每两行合并成一行了。

  • 主要问题是出现光标下移。那么 sed 中能不能控制光标呢?答案是肯定的。

  • 目前我没有找到控制光标移动的方法,但是 sed 支持打标签,这也是 vim 中的功能,sed 作为 linux 三大神器肯定也是有对应功能的,在 sed 中通过 ; 进行语法切割的,和 VIM 一样通过 : label 的方式进行打标签,然后通过 b 或者 t 跳转到标签处。关于 b 和 t 的区别这里不赘述了,记住一句话 b 是跳过当前行脚本后在跳转 label 。这点很重要决定了他存在的位置。

  • 那么我们只需要在每次合并下一行内容并替换换行符后跳回刚开始的那一行就行了。sed ':l;N;s/\n/,/g;tl'

结合光标跳转完美实现换行替换

  • 上面我们使用 t 跳转标签。我们也说了 b 同样可以跳转标签。
  • b 是忽略当前行跳转,因为我们是先执行替换在执行 bl 跳转 l 标签的,所以效果是一样的。但是替换脚本和 bl 位置对掉效果就不一样了。
  • tl 好像加了和没加是一个效果,的确是的,因为先跳转在替换,替换后还是会继续跳到下一行。这里主要是为了大家看看 bl 和 tl 的区别的。

  • 如果你就想先跳转在执行替换脚本的方式实现整个换行操作也是可以的。

  • 上面的又让你蒙蔽了吧。!b 就是不跳过后面的执行,也就是 !bl;...; == ...;tl

  • 至此,我们跳转实现换行符替换就结束了。

总结

特殊含义 解释
[[:alpha:]] 匹配任意字母字符,不管是大写还是小写(等价于[a-zA-Z])
[[:alnum:]] 匹配任意字母数字字符09、AZ或a~z(等价于A-Za-z0-9)
[[:blank:]] 匹配空格或制表符
[[:digit:]] 匹配0~9之间的数字(等价于[0-9])
[[:lower:]] 匹配小写字母字符a~z(等价于[a-z])
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR
[[:upper:]] 匹配任意大写字母字符A~Z(等价于[A-Z])
相关推荐
木木_王3 分钟前
嵌入式Linux学习 | 数据结构 (Day04)链表升级(进阶优化 + 柔性数组原理 + 双向循环链表完整实现 + 高频面试深挖)
linux·数据结构·学习
无籽西瓜a3 分钟前
【西瓜带你学Kafka | 第七期】Kafka 日志存储体系:保留清理、消息格式与分段刷新策略(文含图解)
java·分布式·后端·kafka·消息队列·mq
IT枫斗者9 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
有谁看见我的剑了?9 小时前
linux 添加硬盘后系统识别不到硬盘处理
linux·运维·服务器
小码哥_常9 小时前
解锁AI编程密码:程序员常用的10个AI提示词
后端
yc_122410 小时前
用 Visual Studio 远程调试 Linux:从零到流畅的完整指南
linux·ide·visual studio
直奔標竿10 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
计算机安禾10 小时前
【Linux从入门到精通】第31篇:防火墙漫谈——iptables与firewalld防护指南
linux·运维·php
金銀銅鐵11 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
下一页盛夏花开11 小时前
ubuntu 20中安装QT以后出现红色空心断点
linux·运维·ubuntu