如何使用 bash 删除多行字符串?

如何使用 bash 删除多行字符串?

考虑这个字符串:

文件

This is some text
<#
Love this or that
#>
He is running like a rabbit

例如,为了 grep 换行字符串,id 使用:

cat file | grep -Pzo '(?s)<#.*?#>'

这将输出:

<#
Love this or that
#> 

但如果我想怎么办消除比赛?我该怎么做?

答案1

你可以这样做sed

sed '/<#/,/#>/d' file

它删除两个特定字符串之间的文本。

答案2

-P(GNU 扩展)P实际上是用于 erl 正则表达式,所以:

<file perl -0777 -pe 's/<#.*?#>//sg'

答案3

如果不需要grep,您可以这样做awk

awk 'BEGIN {p=1}; $1 == "<#" {p=0}; $1 == "#>" {p=1; next}; p == 1 {print}' file

p这将在开始时将内部标志设置为 1,0找到“排除开始”模式后将其设置为 1,并在遇到“排除结束”时将其设置回 1。然后,它将仅打印 p 等于 1 的行。next规则中用于匹配结尾的语句对于防止打印结束模式是必要的。

答案4

我不知道这是否优雅,我考虑了一下:

tr "\n" "%" < file | sed -e 's/<#%.*#>%//' | tr "%" "\n"

将新行替换为%

tr "\n" "%"

替换以下之间的所有内容<#%...#>%

sed -e 's/<#%.*#>%//'

替换%为新行:

tr "$" "\n"

输出:

This is some text
He is running like a rabbit

相关内容