我正在使用:
bash $ head -n 2 *.xml | grep (..stuff..)
将所有xml文件的前两行流式传输到grep命令。但是,我意识到这对于这些文件的结构并不可靠。
我需要的是流式传输每个xml文件的开始,直到遇到特定的子字符串(所有这些文件都具有)为止。
head不提供该级别的粒度。子字符串只是标记的开头(例如,类似于“ <标记开头”之类的东西)。如有任何想法,我将不胜感激。谢谢!
答案 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
,这确实起作用。再次感谢。我真的很感激,很抱歉,我没有意识到我的用例比我想象的要简单。