首页 > 解决方案 > 如果还没有换行符,则在匹配模式的行之前创建换行符

问题描述

我有一个文本文件,里面有几行。我要做的是找到与模式匹配的所有行,如果它们之前没有换行符(=非空行),请创建它。像这样的东西,但它不能正常工作:

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

标签: linuxbashshellsed

解决方案


我不太擅长 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选项。


推荐阅读