【问题标题】:Need to match exact sentences on wsdl - grep/awk/sed需要匹配 wsdl 上的确切句子 - grep/awk/sed
【发布时间】:2014-05-12 17:17:47
【问题描述】:

很抱歉,我会尝试更好地解释它:

我必须做一个执行以下操作的脚本 -> 做一个 wsdl 的 curl 或 wget 并找到以下句子:

<schema targetNamespace="http://net.jboss.org/jmx" xmlns="asdasd2001/XMLSchema"> <import namespace=".xmlsoap.org/soap/encoding/" />
<simpleType name="ObjectNameType"> <simpleContent> <extension base="xsd:string" /> </simpleContent> </simpleType> </schema>

如果 wsdl 上存在这些句子,则返回一个布尔值 - 所以我想使用 grep 然而,它没有按我预期的那样工作,因为它会检查是否有任何句子在 wsdl 上。示例

   `PcspI01Service%3Fwsdl | grep -F -f ex.bko
    **<import namespace="org/soap/encoding/" /> 
    </schema>
   <import namespace="org/soap/encoding/" /> 
  </schema>**
  <schema targetNamespace="rg/2001/XMLSchema">
  <import namespace="soap/encoding/" /> 
   <simpleType name="ObjectNameType"> 
   <simpleContent>
   <extension base="xsd:string" /> 
   </simpleContent>
     </simpleType>
     </schema>`

在这个例子中,它向我展示了这些行

 `<import namespace="org/soap/encoding/" /> 
    </schema>`

存在于文件中,但这对我没有帮助,我需要匹配所有行并按照它们的顺序进行

现在更清楚了吗?

提前感谢大家!

【问题讨论】:

  • 这看起来是一件非常间接和脆弱的事情。你确定你不想改为例如查找所有包含名为“ObjectNameType”且扩展名为“xsd:string”的 simpleType 的文件?
  • 你建议怎么做?问题是我需要确保订单得到尊重,以便知道它属于那个部分。我正在做一个运行状况检查脚本来获取 web 服务的 wsdl,如果我发现这些语句,我就知道该 web 服务将失败。
  • 我建议使用能够理解 XML 的 xmlstarlet 或 xmllint 等 XML 工具进行匹配。你没有解释为什么这些行意味着有一个错误,所以我不能更具体。
  • 我试着澄清一下,如果现在更清楚请告诉我
  • Bad: "我需要在 XML 文件中找到这一行,然后是这一行,然后是这一行。"好:“我需要找到名为“ObjectNameType”的 simpleType 节点没有“restriction”元素的 XML 文件,因为这是一个错误。”

标签: linux bash awk sed grep


【解决方案1】:

您只是说要在文件中查找多行字符串吗?那是(使用 GNU awk 进行多字符 RS):

awk -v RS='^$' -v ORS= -v regexp="line1
line2
line3" '$0 ~ regexp' file

您没有发布任何预期的输出,因此上面将仅打印整个文件(如果包含)

line1
line2
line3

如果您需要字符串匹配而不是正则表达式匹配,请使用 index() 而不是 ~

如果您没有 gawk,请选择一些您知道不能在输入文件中用作 RS 的控制字符,或者使用连接一次一行地建立一个记录字符串,然后在结束部分。

如果这不是您想要做的,请编辑您的问题以澄清并添加一些简短的代表性输入和预期输出。

【讨论】: