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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Bash. Работа с текстом. Поиск. Замена. Добавление в конец файла.  (Прочитано 3700 раз)

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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Еще раз и еще раз Браво! Браво! Браво!

Только вот я подумал, что надо не забыть предупредить ТС, что делать что то типа

{код объединения}(file1, file2) > file1

это верный способ отстрелить себе ногу: баш сначала откроет выходной файл file1 на запись (с обнулением), а потом выполнит код объединения с пустым файлом file1!

Т.е. на выходе file1 будет содержать копию file2 :(
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Ну нахвалили… 8) Изменил sed чтоб как awk срабатывал с исходным файлом
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Sly_tom_cat, я однажды наткнулся на это и потом недоумевал. Можно как-то заставить поменять приоритет?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6753
  • 20% Cooler
    • Просмотр профиля
alsoijw,
использовать tee
cat file1 file2 | tee file1
многие команду эту почему-то не любят.

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 19 Января 2016, 22:48:13 от 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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
ALiEN175, только я не совсем понял механизма как tee спасает :idiot2:

tee file1 по идее все равно раньше должна запуститься чем cat file1 file2 :idiot2: и запись в файл должен был бы обнулить file1 :idiot2: Ну это в теории - а на практике то оно работает.... только как? :idiot2:
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6753
  • 20% Cooler
    • Просмотр профиля
Sly_tom_cat,
разница в командах ">" и "|"
паттерн "... | tee ..." никак не может запуститься раньше предшествующей команды.

на хабре было объяснение, ищу ссылку...
команду "... > file" следует читать справа (открыли файл, потом записали данные)
пайпы выполняются последовательно: ... | tee file (выполнили команду, отправили вывод stdout на tee, которая записала файл)

хм, надеюсь, понятно объяснил

http://habrahabr.ru/post/138591 - тут. я уже сонный, но именно там было объяснение. может в комментах, не могу точно сказать, но статья та самая)
« Последнее редактирование: 20 Января 2016, 01:52:52 от 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

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
На сколько я помню | еще и кеширует передаваемое - видимо поэтому и последовательно с лева на право...
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6753
  • 20% Cooler
    • Просмотр профиля
Sly_tom_cat,
кешируется или нет - неважно, важно - если команда не выполнится, ошибок (stderr) в файл не запишется, поэтому надо в конце дописать "2>&1" - чтобы stderr перенаправился в stdout
🖥 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

Оффлайн Dark Smoke

  • Автор темы
  • Активист
  • *
  • Сообщений: 311
    • Просмотр профиля
    • Абонентское обслуживание и ремонт компьютеров в Днепропетровске
Удобно на awk
Код: (bash) [Выделить]
awk '
    BEGIN{FS=OFS="="}
    {A[$1]=$2}
    END{for(i in A)
        print(i, A[i])>ARGV[1]}
    ' my.conf new.conf

Скрипт супер. Все работает, короткий.
Но вот моих знаний не хватает что бы его понять =(

можно его как то доработать что бы новые параметры добавлялись в конец файла, а не в начало как сейчас?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
А что его понимать? Формируется массив А из пары: ключ(до знака «=») + значение(после знака «=»), сначала по исходному файлу, потом по новому. Если в новом попадется такой же ключ как и в старом — то пара ключ+значение перезапишется, если нет — добавится. По окончании ввода (END) выводятся на печать все пары несортированным образом.
Чтобы сделать так как Вы хотите надо существенно увеличить скрипт — или сохранять порядок ключей, или выводить полученные данные в отдельный файл.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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