当文本块中必须存在特定字符串时,如何使用sed/awk在两个模式之间提取文本

当文本块中必须存在特定字符串时,如何使用sed/awk在两个模式之间提取文本,awk,sed,Awk,Sed,我已经找到了几个关于如何在两个模式之间sed/awk的答案,但是我还需要只找到包含字符串的特定文本块 文本示例: <requirement id = "blabla.1" slogan = "Handling of blabla" work-package = "bla444.2" logical-node = "BLA-C" level = "System" >

我已经找到了几个关于如何在两个模式之间sed/awk的答案,但是我还需要只找到包含字符串的特定文本块

文本示例:

<requirement        id = "blabla.1"
                slogan = "Handling of blabla"
          work-package = "bla444.2"
          logical-node = "BLA-C"
                 level = "System"
>
Bla bla.
</requirement>
<requirement        id = "bla.2"
                slogan = "Reporting of blabla"
          work-package = "bla444.1"
          logical-node = "BLA-C"
                 level = "System"
>
Bla bla bla.
</requirement>

等等。
呜呜呜呜。
因此,我们的目标是只获取中间的文本块&工作包中应该有bla444.1!在示例中,这应该只给出最后一个文本块。当然,我想要sed的文件有更多的要求,还有一些需要的工作包,所以不仅仅是sed会找到的最后一个文本块

sed -e 's/<requirement\(.*\)<\/requirement/\1/' file

sed-e的/你能试试下面的吗

awk '
/^<requirement/{
  if(found && value){
    print value
  }
  found=value=""
}
{
  value=(value?value ORS:"")$0
}
/work-package.*bla444.1\"$/{
  found=1
}
END{
  if(found && value){
    print value
  }
}
'  Input_file
awk'

/^ 你能试试下面的吗

awk '
/^<requirement/{
  if(found && value){
    print value
  }
  found=value=""
}
{
  value=(value?value ORS:"")$0
}
/work-package.*bla444.1\"$/{
  found=1
}
END{
  if(found && value){
    print value
  }
}
'  Input_file
awk'
/^ 这可能适用于您(GNU-sed):

或:

cat这可能适合您(GNU-sed):

或:


cat这确实起作用了!既然我有很多来自bla444、bla444.1…x的bla444,我如何更改它来查找只包含bla444的工作包?好的,我找到了:
awk'/^@FotisK,很抱歉我离开了系统,很酷很高兴听到你找到了它,干杯:)这确实完成了工作!既然我有很多来自bla444、bla444.1…x的工作包,我如何更改它以找到只包含bla444的工作包?好的,我找到了:
awk'/^@FotisK,很抱歉我离开了系统,很酷很高兴听到你找到了它,干杯:)这对我不起作用,我假设是因为不同系统上的sed版本不同<代码>>sed-n'/@FotisK可能您的sed版本不理解命令分隔符
在这种情况下,每个命令都可以分成
-e
选项,请参见编辑。或者写入一个文件
commandFile
,每个命令位于单独的一行,名为
sed-nf commandFile file
,我认为这不适用于我,因为不同系统上的sed版本不同<代码>>sed-n'/@FotisK可能您的sed版本不理解命令分隔符
在这种情况下,每个命令都可以分成
-e
选项,请参见编辑。或者写入一个文件
commandFile
,每个命令位于单独的一行,并称为
sed-nf commandFile文件
sed -n '/<requirement/{:a;N;/<\/requirement/!ba;/work-package = "bla444\.1"/p}' file
sed -ne '/<requirement/{' -e ':a' -e 'N' -e '/<\/requirement/!ba' -e '/work-package = "bla444\.1"/p' -e '}' file
cat <<\! | sed -nf - file
/<requirement/{
:a
N
/<\/requirement/!ba
/work-package = "bla444\.1"/p
}
!