Sed 命令和删除行

Sed 命令和删除行

在 bash 脚本中,我尝试删除从 AAA(包含)开始到 BBB(不包含)之间的所有内容。因此,从 AAA 到 BBB 之前的所有内容,以及 BBB 仍将被输出。我想出了下面的行,但它也错误地删除了 BBB。感谢任何帮助。

sed -i '/AAA/,/BBB/d' file.txt

答案1

如果AAABBB位于行首

使用 sed 删除除结束模式之外的行范围有你的问题的答案:

sed -i '/AAA/,/BBB/{/BBB/!d}' file.txt

输入示例:

AAA remove1
remove2
BBB keep3

输出示例:

BBB keep3

如果它们可以出现在一行中间的某个地方

您可以使用正则表达式:

sed -izE 's/(.*?)AAA.*?(BBB.*)/\1\2/g' file.txt

\1括号对正则表达式的各个部分进行分组,因此我们可以稍后通过(第一个捕获组)和\2(第二个捕获组)来引用它们的内容。.*匹配任意字符 ( .) 0 次或多次 ( *)。下面的问号使*“惰性”确保它匹配可能的最短字符串(forAAA foo1 BBB AAA bar2 BBB AAA.*?BBB会匹配AAA foo1 BBB而不是AAA foo1 BBB AAA bar BBB)。

-z参数通过 NUL 字符而不是换行符分隔行,从而允许正则表达式处理多行。

输入示例:

keep1 AAA remove1
remove2
remove3 BBB keep3

输出示例:

keep1 BBB keep3

相关内容