Как я могу удалить все строки перед определенной строкой из ряда файлов - PullRequest
15 голосов
/ 14 сентября 2011

У меня есть 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

Ответы [ 4 ]

21 голосов
/ 14 сентября 2011

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

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

или просто

sed -i '1,/Test XXX/d' file*
6 голосов
/ 27 августа 2013

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

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
1 голос
/ 15 января 2016
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 строк.

1 голос
/ 14 сентября 2011

Вы можете сделать это с помощью 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, чтобы просмотреть все файлы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...