Вывод головы до определенной строки

У меня есть куча файлов в следующем формате.

A.txt:

some text1      
more text2    
XXX
more text  
....  
XXX
.  
.  
XXX 
still more text  
text again  

Каждый файл имеет как минимум 3 строки, начинающиеся с XXX, Теперь для каждого файла A.txt Я хочу написать все строки до 3-го появления XXX (в приведенном выше примере это до строки перед still more text) к файлу A_modified.txt,

Я хочу сделать это в Bash и придумал grep -n -m 3 -w "^XXX$" * | cut -d: -f2 чтобы получить соответствующий номер строки в каждом файле.

Возможно ли использовать head вместе с этими номерами строк для генерации требуемого вывода?

PS: я знаю, что простой скрипт на Python сделает эту работу, но я пытаюсь сделать это в bash без особой причины.

2 ответа

Решение

Более простой метод будет использовать awk, Предполагая, что в вашем текущем рабочем каталоге нет ничего интересного, попробуйте:

for i in *; do awk '/^XXX$/ { c++ } c<=3' "$i" > "$i.modified"; done

Или, если ваши файлы очень большие:

for i in *; do awk '/^XXX$/ { c++ } c>=3 { exit }1' "$i" > "$i.modified"; done

head -n выведет первые 'n' строки файла

#!/bin/sh

for f in `ls *.txt`; do
  echo "searching $f" 

  line_number=`grep -n -m 3 -w "^XXX$" $f | cut -d: -f1 | tail -1` 

  # line_number now stores the line of the 3rd XXX 

  # now dump out the first 'line_number' of lines from this file
  head -n $line_number $f
done
Другие вопросы по тегам