linux - 如果还没有换行符,则在匹配模式的行之前创建换行符
问题描述
我有一个文本文件,里面有几行。我要做的是找到与模式匹配的所有行,如果它们之前没有换行符(=非空行),请创建它。像这样的东西,但它不能正常工作:
sed -i '/[a-zA-Z0-9]/{N;/PATTERN/{s/PATTERN/\nPATTERN/}}' FILENAME
我知道它可能在 awk 或 perl/bash 中更容易和更好地完成,但我更喜欢单行/一步解决方案。
示例输入文件:
LINE1
LINE2
PATTERN
LINE3
PATTERN
LINE4
预期输出:
LINE1
LINE2
PATTERN
LINE3
PATTERN
LINE4
解决方案
我不太擅长 sed,但这是我在 awk 中的做法:
awk 'prev != "" && /PATTERN/ { print "" } { prev = $0; print }' file
如果prev
(上一行)不为空且当前行匹配/PATTERN/
,则打印一个空行。无条件保存当前行以与下一行和当前行进行比较print
。
要实现“就地”编辑(如sed -i
),只需将命令重定向到临时文件,然后覆盖原始文件:
awk 'prev != "" && /PATTERN/ { print "" } { prev = $0; print }' file > tmp && mv tmp file
请注意,由于prev
最初未设置,因此即使第一行匹配,也不会/PATTERN/
在输出开头打印换行符。为了解决这个问题,您可以将条件更改为:
(NR == 1 || prev != "") && /PATTERN/
您还可以使用 GNU awk 实现就地编辑,使用该-i inplace
选项。
推荐阅读
- swift - Swift 中的自定义 Segue
- database - Flyway 初始化失败。看不到文件
- tomcat - 如何使用 Tomcat 在 Geoserver 上提供 https?
- python - 我需要将熊猫数据框打印到 Tkinter 窗口
- r - 基于另一个数据帧从数据帧中删除行
- kubernetes - 是否可以加入不同网络中的工作节点?
- c# - 函数内部的花括号有什么意义?
- java - spring 集成报错信息路由是如何工作的?
- jquery - 设置超时功能以在悬停功能上为 Jquery 添加一个类
- reactor-netty - 没有分块编码的 Spring WebClient