在 bash 脚本中,我尝试删除从 AAA(包含)开始到 BBB(不包含)之间的所有内容。因此,从 AAA 到 BBB 之前的所有内容,以及 BBB 仍将被输出。我想出了下面的行,但它也错误地删除了 BBB。感谢任何帮助。
sed -i '/AAA/,/BBB/d' file.txt
答案1
如果AAA
和BBB
位于行首
使用 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