Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Как удалить строку из всех файлов  (Прочитано 594 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Ввысь

  • Автор темы
  • Активист
  • *
  • Сообщений: 473
    • Просмотр профиля
Здравствуйте.

Подскажите, как удалить строки из всех файлов,
у меня есть такое
grep -v -f /dir/123.txt /dir/all.txt > tmp ; mv -f tmp /dir/all.txt
удаляет из all.txt все значение совпадающие со значениями в 123.txt

А как удалить не из одного, а их всех файлов?

нашел это, но как использовать файл со значениями не пойму
find /dir/ -type f -exec sed -i /text/d {} + ;
Спасибо.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6690
  • 20% Cooler
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #1 : 31 Мая 2021, 23:15:51 »
while read pattern ; do
    find /dir/ -type f -exec sed -i "/$pattern/d" {} \;
done < /dir/123.txt

Неоптимально, но пару раз применить сойдёт. Не забудьте про бекапы)
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 619
  • xUbuntu 22.04
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #2 : 31 Мая 2021, 23:54:25 »
Не забудьте про бекапы

QQ=(/tmp/$(date +%H%M%S)_cp);mkdir $QQ;find . -type f -iname "*.txt" -exec bash \
-c 'cp "$0" "`echo $0|sed -r "s:(.*)/:\1/$(date +%s%4N)∑¢∑_:;s:(.*)/.{8}:\1\/:"`"' \
{} \; 2>/dev/null;sleep 5;find . -type f -iname "*∑¢∑*" -exec mv -t $QQ  {} \; 2>/dev/null

Да, backup это действительно важно!

Данная команда будучи запущенной в конкретной директории скопирует все файлы .txt из данной директории и всех поддирректорий в соответствующую директорию в /tmp (можно в любое другое место). Файлы с одинаковыми именами будут переименованы, к ним будет добавлен уникальный префикс типа 255978∑¢∑_………….txt.

Потом его можно легко удалить при необходимости. Команда ничего «порушить» не должна применял неоднократно.
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Ввысь

  • Автор темы
  • Активист
  • *
  • Сообщений: 473
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #3 : 01 Июня 2021, 16:31:08 »
ALiEN175, спасибо, работает, но вылез один косяк, если попадается вот это --> /, то все ломается
sed: -e expression #1, char 10: unknown command: `1'можно ли это обойти?
« Последнее редактирование: 01 Июня 2021, 17:09:03 от Ввысь »

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 619
  • xUbuntu 22.04
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #4 : 01 Июня 2021, 19:35:46 »
Можно попробовать задействовать переменную.
touch /tmp/123.txt; echo 'one two three' > /tmp/123.txt; \
echo 'one \/ two // six //  \/ three' >> /tmp/123.txt; \
echo 'one | // two | // three' >> /tmp/123.txt
получим
cat 123.txt
one two three
one \/ two // six //  \/ three
one | // two | // three
применим
QQ=( six //); sed -i "/$QQ/d"  /tmp/123.txtполучим
cat 123.txt
one two three
one | // two | // three

Пользователь добавил сообщение 02 Июня 2021, 05:57:09:
Вообще с корявой переменной, которую я указал это весьма для частных случаев.

Вот такая команда может, на мой взгляд лучше подойти:
find . -type f -name "*.txt" -exec bash -c 'sed -i "/one.*two.*six.*three/d" "$0"' {} \;
Т.е. смысл чтобы из строки типа :
one \/ two // six //  \/ threeубрать все „проблемные места”…
« Последнее редактирование: 02 Июня 2021, 05:57:09 от qpdb »
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Ввысь

  • Автор темы
  • Активист
  • *
  • Сообщений: 473
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #5 : 02 Июня 2021, 10:29:02 »
qpdb, в силу моих небольших знаний я видимо не въезжаю как это можно использовать.
Можете описать поподробнее?

у меня два файла, первый выглядит так

синий/белый
желтый
коричневый
34
56/7

второй файл

желтый
синий/белый
красный/зеленый
черный
коричневый
33
2/67
по способу ALiEN175,  все работает, но только если нет слов с -->/, если я убираю все слова с -->/ все работает, как только попадается слово с -->/ все ломается.
« Последнее редактирование: 02 Июня 2021, 13:48:50 от Ввысь »

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 619
  • xUbuntu 22.04
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #6 : 02 Июня 2021, 14:09:04 »
Приветствую!
Ввысь,
в силу моих небольших знаний
У меня они тоже не шикарные :) , во всяком случае никакого избытка знаний я у себя не наблюдаю…

Вашу ситуацию я вижу так: у Вас есть определённое количество текстовых файлов, для простоты, предположим, что они находятся в одной директории.

Из этой группы файлов Вам нужно удалить строки, которые содержат допустим ❰  ' @ # синий/белый \/ // 😎 \n all sorts of nonsense ❱. Предполагаем, для простоты, что во всех этих файлах то что в ❰❱ идентично.

У меня проблемы с терминологией на русском языке, я и не носитель русского, не нахожусь среди русскоговорящих, использую этот язык только на письме, прошу это учесть.

Без экранизации пробелов, „/”, „)”, „(” и ряда других символов sed не будет обрабатывать pattern (образец).

Потому образец нужно предварительно подготовить. Проще всего это сделать так:
  ' @ # синий/белый \/ // 😎 \n all sorts of nonsense  ⮞⮞ Др…
.*синий.*белый.*all.*sorts.*of.*nonsense.*             ⮞⮞ После…
Далее с готовым образцом для удаления можно пойти разными путями.

Мною описан вариант для единичного образца, т.е. далее

find . -type f -name "*.txt" -exec bash -c 'sed -i "/.*синий.*белый.*all.*sorts.*of.*nonsense.*/d" "$0"' {} \;
Из всех файлов файлов в директории будет удалено
❰  ' @ # синий/белый \/ // 😎 \n all sorts of nonsense ❱ т.е. то что в ❰❱…

Если удалять нужно разные образцы и они содержат специальные символы, то возможно придётся писать короткий скрипт.
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Ввысь

  • Автор темы
  • Активист
  • *
  • Сообщений: 473
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #7 : 02 Июня 2021, 15:23:25 »
нужно удалить строки, которые содержат допустим

немного не так, мне нужно удалить совпадающие

примерно так

в одном файле слово - синий
во втором файле слово - синий
удаляем из первого файла слово - синий

но там попадается символ /, вот тут все перестает работать

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6690
  • 20% Cooler
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #8 : 02 Июня 2021, 17:41:15 »
while read pattern ; do
    find /dir/ -type f -exec sed -i "/${pattern//\//\\/}/d" {} \;
done < /dir/123.txt
удаляет, кстати не слово а всю строчку, содержащую $pattern.

Для удаления только совпадения
while read pattern ; do
    find /dir/ -type f -exec sed -i "s/${pattern//\//\\/}//g" {} \;
done < /dir/123.txt



Пользователь добавил сообщение 02 Июня 2021, 17:45:36:
ИЛИ  :) :)
while read pattern ; do
    find /dir/ -type f -exec sed -i "~$pattern~d" {} \;
done < /dir/123.txt

while read pattern ; do
    find /dir/ -type f -exec sed -i "s~$pattern~~g" {} \;
done < /dir/123.txt
« Последнее редактирование: 02 Июня 2021, 18:30:00 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Ввысь

  • Автор темы
  • Активист
  • *
  • Сообщений: 473
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #9 : 03 Июня 2021, 16:21:06 »
ALiEN175, первый и второй вариант ругаются вот так

./prov.sh: 12: ./prov.sh: Bad substitution
третий выдал много строк

sed: -e expression #1, char 3: invalid usage of +N or ~N as first address
четвертый рабочий, но остаются пустые строки, потом убираю их так

sed -i '/^$/d' all_data.txt
а возможно за одно действие и пустые строки убирать?


Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 619
  • xUbuntu 22.04
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #10 : 03 Июня 2021, 20:07:57 »
Ввысь, а можно ли все ваши txt файлы объединить в один? В смысле :
cat *.txt > MIX.txtЭто повлияет на задачу?

Если не повлияет, то в объединённом файле можно будет удалить все дубликаты вот такой командой.

awk -i inplace '!($0 in a) {a[$0];print}' MIX.txt
При этом порядок строк не изменится , пустая строка будет во всём файле только одна.

Вообще пустые строки, а также если там только пробелы и табуляция можно удалить вот так:

sed -i '/^[ \t]*$/d ;s:^[ |\t]*::;s:[ |\t]*$::' MIX.txt

Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Ввысь

  • Автор темы
  • Активист
  • *
  • Сообщений: 473
    • Просмотр профиля
Re: Как удалить строку из всех файлов
« Ответ #11 : 03 Июня 2021, 21:08:00 »
Это повлияет на задачу?
Нет, объединять нельзя. Один файл пополняемый, в другом шаблоны.

пустые строки, а также если там только пробелы и табуляция можно удалить вот так
Спасибо, затестирую.

 

Страница сгенерирована за 0.047 секунд. Запросов: 25.