Подтвердить что ты не робот

Как я могу удалить все строки перед определенной строкой из нескольких файлов

У меня есть n файлов, например:

file1:

1aaa
2eee

Test        XXX
Hanna
Lars 

file2:

1fff
2ddd
3zzz

Test        XXX
Mike
Charly

Я хочу удалить все строки перед "Test XXX" из всех n файлов. Количество строк для удаления зависит от файлов.

Моя идея:

for file in 1 :n
do
pos=grep -n "Test XXX" file$file
sed -i "1:$pos-1 d" file$file >new$file
done
4b9b3361

Ответ 1

Это должно сработать для вас:

sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2

или просто

sed -i '1,/Test XXX/d' file*

Ответ 2

Это будет работать для ваших примеров и даже если совпадающий шаблон находится в самой первой строке:

sed -n -E -e '/Text XXX/,$ p' input.txt | sed '1 d'

Например, если вы вводите просто

Test        XXX
Mike
Charly

Это даст вам

Mike
Charly

Если вы хотите сохранить первое совпадение Test XXX, просто используйте:

sed -n -E -e '/Text XXX/,$ p' input.txt

Ответ 3

Вы можете сделать это с помощью bash (например, для 1 файла)

t=0
while read -r line
do
    [[ $line =~ Test.*XXX ]] && t="1"
    case "$t" in
     1) echo "$line";;
    esac
done < file > tempo && mv tempo file

Используйте цикл for, если необходимо, чтобы просмотреть все файлы

Ответ 4

cat <<-EOF > file1.txt
1aaa
2eee

Test        XXX
Hanna
Lars
EOF

cat file1.txt | sed -e '/Test *XXX/p' -e '0,/Test *XXX/d'

Вывод:

Test        XXX
Hanna
Lars

Пояснение:

  • -e '/Test *XXX/p' дублирует соответствие линии /Test *XXX/
  • -e '0,/Test *XXX/d' удаляет из строки 0 в первую строку, соответствующую /Test *XXX/

Дублируя строку, а затем удаляя первую, мы эффективно сохраняем согласованную строку, успешно удаляя все строки ДО Test XXX

Примечание. Это не будет работать, как ожидалось, если есть несколько строк Test XXX.