使用SSH查找和替换多行字符串的REGEX

omhiaaxx  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(187)

假设我有一个TXT文件:

line 1
some text ABC
line 3
line 4
XYZ

我想删除ABC和XYZ之间的所有内容,包括这两个字符串,因此结果应为

line 1
some text

我使用以下命令

find . -type f -name "*.txt" -exec sed -i '/ABC/,/XYZ/d' {} \;

但它也删除了“一些文本”部分,结果是

line 1

如何调整正则表达式?
这是这个问题的一个修正:Find and replace multiple line string using SSH作为答案,删除整行。

qfe3c7zg

qfe3c7zg1#

sed可能适合您:

sed '/ABC/,/XYZ/{/ABC/!d; s///;}' file

line 1
some text

细目:

  • /ABC/,/XYZ/:在模式ABCXYZ之间运行
  • {:动作块开始
  • /ABC/!d;:如果行没有ABC,则将其删除
  • s///;:将搜索模式ABC替换为空字符串
  • }:操作块结束
uplii1fm

uplii1fm2#

使用GNU sed

$ sed -Ez 's/ABC.*XYZ//' input_file
line 1
some text
e4eetjau

e4eetjau3#

这可能对您有用(GNU sed):

sed '/ABC/{:a;N;/XYZ/!ba;s/ABC.*XYZ//}' file

收集以字符串ABC开头、以字符串XYZ结尾的行。
ABC替换为与XYZ完全匹配的最后一个字符串。
注意:.*是贪婪的,如果最后一行包含两个或更多字符串XYZ,可能会删除太多,在这种情况下,使用:

sed '/ABC/{:a;N;/XYZ/!ba;s/XYZ/\n/;s/ABC.*\n//}' file

相关问题