Я пытаюсь удалить все строки, прибывает после определенного шаблона в файлы.
У меня есть много файлов, которые у всех есть та же структура:
Пример:
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
содержит номер строки, в каждом файле, где шаблон существует.
Теперь, я пытаюсь использовать те числа для удаления всех строк, которые прибывают после шаблона в конец файла.
Это означает, что я должен сохранить файл от главы к строке башмака, которая должна быть включена.
Я признателен за Вашу помощь
Это очень тривиально с утилитами обработки текста. Например, использование 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' *
Спасибо @Zanna
Я нашел это решение:
for ((i=1;i < $count+1 ;i++))
sed -n '/PATTERN/q;p' $i.txt > file_out$i.txt
Спасибо
Попробуйте этот сценарий оболочки. Требуется 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
Другое решение, с помощью 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 сценария.
sed -i -e '/pattern/{n;N;d;}' ./infile
Удалить две строки после шаблона, эксклюзив