我想根据我正在搜索的字符串从文件中删除行,如下所示:
sed -i.bak '/xyz/d' "$PATH"
问题对我来说是包含该字符串的行,并用“\”分隔多行,如下所示:
this is the string im looking for xyz but there \
are other lines \
that are part \
of that \
god damn line
有一种简单的方法可以用bash / sed / regex删除整个“行”吗?
答案 0 :(得分:4)
你可以说:
sed -e :a -e '/.*xyz.*\\$/N; s/\\\n//; ta' -e '/xyz/d' filename
(这会加入包含xyz
的行,该行分为多个以/
结尾的行,然后将其删除。)
答案 1 :(得分:3)
这可能适合你(GNU sed):
sed ':a;/\\$/{N;ba};h;s/\\\n//g;/xyz/d;g' file
这会收集多行,将它们复制到保留空间,删除分割线标记,然后删除整行,如果它包含xyz
。如果该行不包含xyz
,则原始分割线将被替换并打印出来。
如果首选合并所有多行,则:
sed ':a;/\\$/{N;ba};s/\s*\\\n\s*/ /g;/xyz/d' file
答案 2 :(得分:1)
因为sed一次只运行一行,所以你需要使用N
命令来加入这些行。
这篇文章很好地解释了用法:How the 'N' command works in sed?