Содержимое потокового файла до появления подстроки - PullRequest
0 голосов
/ 02 июля 2019

Я использовал:

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

для потоковой передачи первых 2 строк всех XML-файлов в команду grep.Однако я понял, что это не надежно для структуры этих файлов.

Вместо этого мне нужно потоковое начало каждого файла XML до тех пор, пока не встретится определенная подстрока (которая есть во всех этих файлах).

головка не обеспечивает такой уровень детализации.Подстрока - это просто начало тега (например, что-то вроде «<начало тега»).Буду благодарен за любые идеи.Спасибо! </p>

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Звучит так, будто вы хотите любой из них (используя GNU awk для nextfile) в зависимости от того, хотите ли вы печатать строку тега или нет:

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
0 голосов
/ 03 июля 2019

Я ценю все ответы.Я обнаружил, что на самом деле мне нужно только содержимое одного тега, а не с начала XML-файлов.Это упростило разбор.Например:

<mt:myTag LOTSOFSTUFF >"

, мне действительно нужен был только LOTSOFSTUFF.Поэтому я просто сделал:

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

, и это сработало точно.Еще раз спасибо.Я действительно ценил и сожалею, что не понял, что мой вариант использования был проще, чем я предполагал.

0 голосов
/ 02 июля 2019

Если вы знаете максимальное количество строк, которые у вас есть до соответствующей строки, вы можете сделать что-то вроде этого:

# 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
#
...