考虑这个字符串:
文件
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