流文件内容直到遇到子字符串

时间:2019-07-02 18:55:56

标签: linux sed grep

我正在使用:

bash $ head -n 2 *.xml | grep (..stuff..)

将所有xml文件的前两行流式传输到grep命令。但是,我意识到这对于这些文件的结构并不可靠。

我需要的是流式传输每个xml文件的开始,直到遇到特定的子字符串(所有这些文件都具有)为止。

head不提供该级别的粒度。子字符串只是标记的开头(例如,类似于“ <标记开头”之类的东西)。如有任何想法,我将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

如果您知道匹配字符串之前的最大行数,则可以执行以下操作:

# cat testfile 
123
9
1
1
2
3
4000
TAG
456
# grep -m 1 -B 10 TAG testfile | grep -v TAG
123
9
1
1
2
3
4000
#

答案 1 :(得分:0)

是否需要这些声音(对于nextfile使用GNU awk)取决于您是否要打印标记行:

awk '/< tag start/{nextfile} 1' *.xml

awk '1; /< tag start/{nextfile}' *.xml

或以任何awk效率较低:

awk 'FNR==1{f=1} /< tag start/{f=0} f' *.xml

awk 'FNR==1{f=1} f; /< tag start/{f=0}' *.xml

或在这种情况下恢复效率:

for file in *.xml; do
    awk '/< tag start/{exit} 1' "$file"
done

答案 2 :(得分:0)

我感谢所有答复。我发现实际上我只需要一个标签的内容,而不是从xml文件的开头开始。这简化了解析。例如:

<mt:myTag LOTSOFSTUFF >"

,我真的只需要LOTSOFSTUFF。所以我只是做了:

grep -oP "<mt:myTag(.*)>" *.xml | grep_more

,这确实起作用。再次感谢。我真的很感激,很抱歉,我没有意识到我的用例比我想象的要简单。