2017-10-20 121 views
1

我有一个XML文件中排除一个符号,它没有前转义字符线之间具有“<” .. 所以,第一件事我试图解析使用XML:grep来在开始

xmllint --noout filename.xml 

但不工作..因为我的XML版本为1.1,其不支持.. 所以我开始寻找“<”不包括开头或句末备用..

应该是相当容易..我试过了:

grep -v '^[<]' 

,但不工作..有人可以帮忙吗?

例如: 文件名有:

<instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
    <field fieldname="CUR007" value="<EUR>"/> 
    <field fieldname="C207" value="2023-01-11"/> 
    <field fieldname="INS160" value="0"/> 
    <field fieldname="PRD013" value="1020"/> 
    <field fieldname="PRD150" value="0"/> 
    <field fieldname="PRD205" value="0"/> 
</instrument> 

我想输出成为

<instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
    <field fieldname="CUR007" value="<EUR>"/> 
+0

编辑.. :)感谢 – thealchemist

+0

,我无法理解你所需要的逻辑...你可以试着解释为什么只有前两行要显示在输出中? – Sundeep

+1

@sundeep因为有一个'“<”'不是第一个或最后一个(不包括空格) – Bohemian

回答

1

搜索一个<>比第一/最后一个非空白字符应该是尖括号等。

grep '^\s*<.*[<>].*>\s*' 

注意,这整条生产线相匹配,所以它可能如果你想要做的线(而不是只是其中的一部分)的东西被使用。


测试:

grep '^\s*<.*[<>].*>\s*' << EOF 
> <instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
> <field fieldname="CUR007" value="<EUR>"/> 
> <field fieldname="C207" value="2023-01-11"/> 
> <field fieldname="INS160" value="0"/> 
> <field fieldname="PRD013" value="1020"/> 
> <field fieldname="PRD150" value="0"/> 
> <field fieldname="PRD205" value="0"/> 
> </instrument> 
> EOF 

输出:

<instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
<field fieldname="CUR007" value="<EUR>"/> 
+0

'\ s'“<”是不是话,肯定一开始是..想法是检查该文件,如果它遵循标准的XML模式..我仍然与封闭挣扎“>”不会是可以使用'grep'^ [[:space:]] * <。* <'''或'grep'^ [[:blank:]] * <。* <'' – Sundeep

+0

Thanks a lot @Bohemian ..并且关于在最后搜索'>'..? – thealchemist

+0

@thealchemist我已经编辑了答案,以匹配除了它们应该在的位置之外的尖括号。 – Bohemian

1

我创建了一个不同的样本添加一些更多的情况下

$ cat ip.txt 
foo bar < xyz 
<123 abc <42> > 
    <good> 
bad > line 

$ # get lines having < not at start of line 
$ grep '[^[:blank:]].*<' ip.txt 
foo bar < xyz 
<123 abc <42> > 

$ # get lines having > not at end of line 
$ grep '>.*[^[:blank:]]' ip.txt 
<123 abc <42> > 
bad > line 

$ # combining the two 
$ grep -E '[^[:blank:]].*<|>.*[^[:blank:]]' ip.txt 
foo bar < xyz 
<123 abc <42> > 
bad > line 
  • [:blank:]代表空格和制表符
  • 所以[^[:blank:]]将匹配一个非空字符
+1

谢谢百万sundeep ..帮了很多:) – thealchemist