Удалите строки, которые прибывают после строки с определенным шаблоном в Shell

Я пытаюсь удалить все строки, прибывает после определенного шаблона в файлы.

У меня есть много файлов, которые у всех есть та же структура:

Пример:

file1

line 1
...
line x "here there is a specific pattern"
...
EOF

файл n

line 1
...
line x "here there is a specific pattern"
...
EOF

Я пытался получить простое решение, но так как у меня есть много файлов, я возобновляю длинный путь :p

Шаблон появляется одно время в каждом файле.

Так, я получил все число строк, которое содержит этот шаблон, и сохраните в одном файле.

это - мой код:

count=$(ls -f path_to_folder/*.txt | wc -l)
echo "Number of txt file : $count"
###


    for ((i=1;i < $count+1 ;i++))

    {

    vt=$(grep -n PATTERN $i.txt | cut -d : -f 1)
    echo $vt >> PATTERN_line.txt

    }

Каждая строка в PATTERN_line.txt содержит номер строки, в каждом файле, где шаблон существует.

Теперь, я пытаюсь использовать те числа для удаления всех строк, которые прибывают после шаблона в конец файла.

Это означает, что я должен сохранить файл от главы к строке башмака, которая должна быть включена.

Я признателен за Вашу помощь

7
задан 6 April 2018 в 03:46

5 ответов

Это очень тривиально с утилитами обработки текста. Например, использование sed:

sed '1,/pattern/!d' file

При значении соответствуйте каждой строке от первого до того с pattern и удалите все неподобранные строки. Так, замена pattern с Вашим шаблоном. Если это содержит /, необходимо выйти из тех символов. Например, если шаблон pattern-with/character:

sed '1,/pattern-with\/character/!d' file

Чтобы на самом деле отредактировать файлы (а не распечатать отредактированный поток к stdout), можно использовать -i флаг:

sed -i '1,/pattern/!d' file

Можно сделать резервное копирование исходного файла путем добавления расширения для старого файла к -i. Заботьтесь здесь - Вы не должны включать пространство перед расширением.

sed -i.backup '1,/pattern/!d' file

sed берет несколько аргументов имени файла. Например, для действия на все нескрытые файлы в текущем каталоге Вы могли использовать:

sed -i '1,/pattern/!d' *
13
ответ дан 23 November 2019 в 06:15

Спасибо @Zanna

Я нашел это решение:

for ((i=1;i < $count+1 ;i++)) 

sed -n '/PATTERN/q;p' $i.txt > file_out$i.txt

Спасибо

1
ответ дан 23 November 2019 в 06:15

Попробуйте этот сценарий оболочки. Требуется 2 аргумента в качестве входа. Первым аргументом является входное имя файла. И вторым аргументом является необходимый шаблон для поиска. Это удалит строки после того, как шаблон будет подобран в первый раз.

#!/bin/bash

touch temp.txt

while read line
do
    echo "$line" | grep "$2" &> /dev/null
    if [ $? -eq 0 ]
    then
        echo "$line" >> temp.txt
        mv temp.txt $1
        echo "STATUS: Pattern matched. Successful operation..."
        exit 0
    fi
    echo "$line" >> temp.txt
done < $1

echo "STATUS: Pattern not found. No lines are deleted..."
rm -f temp.txt
0
ответ дан 23 November 2019 в 06:15

Другое решение, с помощью awk:

awk '/specific-pattern/{stop=1} stop==0{print}' < input_file >> output_file

В то время как переменная stop 0 (который является, по умолчанию), awk распечатает текущую строку. Однако, если текущая строка соответствует регулярному выражению/specific-pattern/, то stop будет установлен на 1. Это делает stop==0 неверный, таким образом, awk больше не будет выполняться print оператор.

Вход читается из input_file и добавляется к output_file.

Если Вы хотите сохранить строку с шаблоном, инвертируйте две части awk сценария.

1
ответ дан 23 November 2019 в 06:15
sed -i -e '/pattern/{n;N;d;}' ./infile

Удалить две строки после шаблона, эксклюзив

0
ответ дан 18 June 2020 в 17:13

Другие вопросы по тегам:

Похожие вопросы: