Регулярные выражения - плохой способ разбора XML, лучше использовать какой-то синтаксический анализатор XML.
Если вы действительно хотите использовать sed / awk / shell / grep и т. Д., Первое, о чем я могу подумать:
cat tst | xargs | grep -o '<\s*C\s*o\s*d\s*e[^>]*>' | wc -l
Я не очень хорошо знаю awk, но я уверен, что есть awk ninjas, которые могут сделать это более элегантно, чем это.
Он считает только вхождения <Code>
(и варианты), но не закрывающий тег, поэтому, если у вас есть (например) 10 <Code>
в вашем файле, но только 9
, он вернет 10 а не 9.
В основном:
cat tst | xargs
кошки 'tst' в оболочку все на одной строке (поэтому мне не нужно беспокоиться о новых строках);
grep -o '<\s*C\s*o\s*d\s*e[^>]*>'
печатает все совпадения <Code{optional other stuff}>
, где вы можете иметь новые строки / пробелы между всеми буквами Code
(-o
печатает всего совпадений с регулярным выражением, по одному на строку );
wc -l
считает строки.
Попробуйте каждый бит подряд, чтобы понять, что я имею в виду.
Для меня tst
было просто копией того, что у вас есть выше.
[foo@bar ~]$cat tst
Format #1:
<Code>value1</Code> <Code>value2</Code>
Format #2:
<Code Attr1=va>value1</Code> <Code Attr1=va
Attr2=va>value1</Code>
Format #3:
<Code>value1</Code><Code>value2</Code> (All Codes can be in
a single line or multiple lines)
Format #4
<Code Attr1=va>value1</Code><Code Attr2=va>value1</Code>
Format #5:
<Cod
e>Value1</Code
<Code Attr=1> </C
ode>
[foo@bar ~]$cat tst | xargs
Format #1: <Code>value1</Code> <Code>value2</Code> Format #2: <Code Attr1=va>value1</Code> <Code Attr1=va Attr2=va>value1</Code> Format #3: <Code>value1</Code><Code>value2</Code> (All Codes can be in a single line or multiple lines) Format #4 <Code Attr1=va>value1</Code><Code Attr2=va>value1</Code> Format #5: <Cod e>Value1</Code <Code Attr=1> </C ode>
[foo@bar ~]$cat tst | xargs | grep -o '<\s*C\s*o\s*d\s*e[^>]*>'
<Code>
<Code>
<Code Attr1=va>
<Code Attr1=va Attr2=va>
<Code>
<Code>
<Code Attr1=va>
<Code Attr2=va>
<Cod e>
<Code Attr=1>
[foo@bar ~]$cat tst | xargs | grep -o '<\s*C\s*o\s*d\s*e[^>]*>' | wc -l
10