Ответ 1
Это должно сработать для вас:
sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2
или просто
sed -i '1,/Test XXX/d' file*
У меня есть 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
Это должно сработать для вас:
sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2
или просто
sed -i '1,/Test XXX/d' file*
Это будет работать для ваших примеров и даже если совпадающий шаблон находится в самой первой строке:
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
Вы можете сделать это с помощью 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
, если необходимо, чтобы просмотреть все файлы
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
.