LINUX.ORG.RU

Изменение строк в файле

 


0

1

Хочется что-то типа такого:

lib.systemd.system-sleep.firefox.sleep.someString="yes"
Добавит или изменит в 
/lib/systemd/system-sleep/firefox.sleep

строку 
someString="yes"

Как вообще подойти к этому вопросу? Хочется это на баше сделать. Открываем файл с такими инструкциями, парсим строки, разбиваем их по точке. Последнее разбиваем по =. Первый элемент массива строка - второе значение. Всё до этого меняем точку на /? Или может что-то есть уже готовое для такого?

★★★
Ответ на: комментарий от Anoxemian

В каком виде? В любом случае, она должна будет парсить файл с правилами. Я бы на питоне это сделал, но хочу, чтобы было привязано только к башу. И да, на питоне это надо будет подключать фабрик, что уже зависимости от чего-то

serg002 ★★★
() автор топика
Последнее исправление: serg002 (всего исправлений: 2)

Как вообще подойти к этому вопросу? Хочется это на баше сделать.

Первая ошибка.

Адекатный разработчик возьмёт любой нормальный скриптовый язык программирования доступный в любом десктопном дистрибутиве Linux из коробки: Perl, Python, Lua и пр., сделав аккуратный, понятный и поддерживаемый скрипт, в который при необходимости можно будет легко вносить какие-либо изменения.

Bash-макака наговнякает нечитаемое и тормозное дерьмо смачно измазав всё вызовом кучи сторонних утилит и регулярками с таким числом \\\\\\\\\\\\\\\-городьбы, что любой кто это увидет покрутит пальцем у виска. Первый запуск этого куска Bash конечно же отработает не так как задумывалось и макака примется отлаживать свой кал, добавляя в него костыли и различные экранирования всяких пробелов, жонглируя 10-ю видами кавычек. Случайно промахнувшись в этом клоунском представлении Bash-скрипт внезапно добавит строку someString="yes" во все файлы в $HOME или удалит ~/.config, такие случаи при использовании Bash очень часты. В сухом остатке получится абсолютно неподдерживаемая субстанция и при попытках внесения изменений проще будет написать всё заново чем разобраться в этих фекальных массах.

Вердикт: не стоит захламлять нашу планету дурно пахнущими порянками Bash-скриптов, пожалейте природу.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
# Откуда ты хочешь брать эту строку, я не понял, поэтому захардкодил
INITIAL_STRING='lib.systemd.system-sleep.firefox.sleep.someString="yes"'

# "Парсим" всё в переменные
FILENAME=$(echo "$INITIAL_STRING" | sed -E 's@(.*)\.[a-zA-Z]+=.+@/\1@;s@\.@/@g')
STRING_TO_EDIT=$(echo "$INITIAL_STRING" | sed -E 's@.*\.([a-zA-Z]+=.+)@\1@')
VARIABLE_TO_EDIT=$(echo "$STRING_TO_EDIT" | sed -E 's/=.*//')
VALUE_TO_EDIT=$(echo "$STRING_TO_EDIT" | sed -E 's/.*=//')

# С добавлением понятно, что ты там менять собрался, я не понял, так что сам разберёшься

# Добавляем строку в конец файла
echo "$VARIABLE_TO_EDIT=$VALUE_TO_EDIT" >> "$FILENAME"

С тебя з/п джуна за 2 минуты.

На баше в лоб — так. Но лучше сразу бери Python и бей на строки нормально, а не вызовом sed кучу раз и т.д.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от EXL

Так нужно не bash-макаку привлекать, а нормального программиста. У меня в прошлой конторе автоматизация части задач на RHEL 5-8, AIX 7, Solaris 8-11, Ubuntu 16.04-20.04 работала именно на bash — и проблем не было, все живы.

Python и прочие имеют свои приколы со сборками их под разные ОС и с разницей синтаксиса в версиях — а bash имеет готовые пакеты под почти все Unix системы и высокую обратную совместимость.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)

Десяток сообщений в теме, даже с примерами кода. И никто не спросил у ТС по какому правилу lib.systemd.system-sleep.firefox.sleep должно преобразоваться в lib/systemd/system-sleep/firefox.sleep, а не в lib/systemd/system-sleep/firefox/sleep (тем более, что оба файла могут существовать одновременно)

kss ★★★★★
()
Ответ на: комментарий от Anoxemian

Я немного юморнул)). Был и наверное есть до сих пор язык ADA , названый в честь графини Ады Лавлейс , сотрудницы Чарльза Бэббеджа и своего рода первой программисткой))

symon2014 ★★
()

Ясно. Я уже понял как это всё делать. Да, на баше это проблематично делать, увы. Попробую на вот этом скриптовом яп сделать

serg002 ★★★
() автор топика

Или может что-то есть уже готовое для такого?

sed

Если он тебя не устраивает — напиши конкретно, чего не хватает. (Лично мне не хватает обработки многострочных конструкций, и то не исключено, что я просто чего-то не знаю.)

hobbit ★★★★★
()

Вот видит Патрик, не хотел я этого...

Никогда так не делай!

Но если ты позиционируешь себя как гуру баша, для тебя вообще не должно составить трудности набыдлокодить подобное вместо того, чтобы заводить темы на ЛОРе. Это элементарщина.

#!/bin/bash

VAR='lib.systemd.system-sleep.firefox.sleep.someString="yes"'
# /lib/systemd/system-sleep/firefox.sleep
DOT='.'
S=${VAR//"$DOT"}
COUNT=$(((${#VAR} - ${#S}) / ${#DOT}))

declare -a PATH
PATH=( $(echo ${VAR} | /usr/bin/tr '.' ' ') )
FILENAME="/${PATH[0]}"
for (( i = ${COUNT} ; i >= 3 ; i-- ))
do
    FILENAME="${FILENAME}/${PATH[-${i}]}"
    if [[ ${i} == 3 ]]
    then
        FILENAME="${FILENAME}/${PATH[-3]}.${PATH[-2]}"
        echo ${PATH[-1]} >> ${FILENAME}
        exit 0
    fi
done
shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Теперь ясно, почему он не может переехать в WM, чтобы там в окружении нужное себе написать на баше? Что не пиши, а получаются говнопортянки типа этого

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

Ты просил чистый bash с минимум зависимостей, тебе дали чистый bash (к слову, можно и от tr уйти, оставив только bash, но это тебе вторая часть домашнего задания). Ты неизвестно сколько сам валандался с этой задачей, потом уже почти неделю с этой темой на форуме так и не понял, что и как сделать, хотя тебе всё расписали несколько человек до меня. И ты всё ещё продолжаешь считать эту задачу сложной, судя по тому, что ты тут пишешь.

shell-script ★★★★★
()
Ответ на: комментарий от Vsevolod-linuxoid

Я уже не один раз рассказывал тут на форуме, как принимал участие в миграции тысяч скриптов для обработки данных в одном крупном международном банке. Там на чистом шелле(не только bash, ещё ksh и csh) были написаны библиотеки, которые реализовывали кучу всякого. В том числе и парсинг, который можно было бы сделать sed'ом и awk'ом. Мы обработали все эти скрипты, привели к единому виду на bash и портировали с solaris на redhat. Было это в 2017-ом году и эти скрипты продолжают сейчас в проде перемещать данные о миллионах денег. И ещё несколько десятков лет будут, пока их кто-нибудь наконец не перепишет на чём-нибудь ещё. :)

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Ну это вероятно потому, что на старых Unix не было единой реализации sed, awk, grep — каждый тащил свою, вот и написали на шеллах, которые были более стандартизированы.

Vsevolod-linuxoid ★★★★★
()
Ответ на: комментарий от Vsevolod-linuxoid

Да. Именно по этому.

А так как банковская сфера очень консервативна, они не могут просто так взять и переписать всё с нуля. Система, для которой мы это всё портировали, представляет из себя огромный такой cron-переросток. Среди прочего, валидация результата в этой системе проводилась путём анализа выхлопа скриптов. Поэтому в нашу задачу входило среди прочего получить в итоге минимум зависимостей и по возможности идентичный stdin/stdout/stderr. Вот и выкручивались.

Поэтому я задачи «написать на bash» воспринимаю буквально.

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от shell-script

Ты нам всем не рассказывай сказки, про

как принимал участие в миграции тысяч скриптов для обработки данных в одном крупном международном банке

Мы обработали все эти скрипты, привели к единому виду на bash и портировали с solaris на redhat

и эти скрипты продолжают сейчас в проде перемещать данные о миллионах денег

То, как ты пишешь на баше - мы уже увидели. Не один вменяемый товарищ, который написал на баше больше 100 строк, не будет даже PoC выкладывать в таком безобразном виде

serg002 ★★★
() автор топика
Ответ на: комментарий от shell-script

Для тебя лично, я скопирую свой ответ из Неправомерно удалили топик (комментарий)

По скрипту: ты не удосужился вникнуть в топик, где мы все пришли к выводу, что конструкция

VAR='lib.systemd.system-sleep.firefox.sleep.someString="yes"'

неправильная т.к имя файла и делимитер равно точка. Как правильно сделать - я уже вне топика додумал. К тому же, там в шапке топика не такая реализация, как у тебя. Что противоречит правилам батла. Решить задачу топика. А она таки не такая, как ты реализовал. Ну и да, ты пропердолился час с неверной реализацией

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

serg002 ★★★
() автор топика
Ответ на: комментарий от shell-script
cat /lib/systemd/system-sleep/firefox.sleep1
#!/usr/bin/env bash
vasyapetya
VAR='lib.systemd.system-sleep.firefox.sleep1.someString="yes"'
# /lib/systemd/system-sleep/firefox.sleep
DOT='.'
S=${VAR//"$DOT"}
COUNT=$(((${#VAR} - ${#S}) / ${#DOT}))

declare -a PATH
PATH=( $(echo ${VAR} | /usr/bin/tr '.' ' ') )
FILENAME="/${PATH[0]}"
for (( i = ${COUNT} ; i >= 3 ; i-- ))
do
    FILENAME="${FILENAME}/${PATH[-${i}]}"
    if [[ ${i} == 3 ]]
    then
        FILENAME="${FILENAME}/${PATH[-3]}.${PATH[-2]}"
        echo ${PATH[-1]} >> ${FILENAME}
        exit 0
    fi
done

out:

./test.sh
./test.sh: line 58: /lib/systemd/system-sleep/firefox/firefox.sleep1: No such file or directory

Я его даже не запускал. Визуально видно, что оно не рабочее. Вот ^ запустил

serg002 ★★★
() автор топика
Последнее исправление: serg002 (всего исправлений: 2)
Ответ на: комментарий от shell-script

Я уже не один раз рассказывал тут на форуме, как принимал участие в миграции тысяч скриптов для обработки данных в одном крупном международном банке.

Там на чистом шелле(не только bash, ещё ksh и csh) были написаны библиотеки, которые реализовывали кучу всякого. Мы обработали все эти скрипты, привели к единому виду на bash и портировали с solaris на redhat. Было это в 2017-ом году и эти скрипты продолжают сейчас в проде перемещать данные о миллионах денег.

Что за крупный банк, который транзакции обрабатывает баш скриптами на редхате, а не на мейнфрейме? И баш скрипты прошли pci pa-dss аудит?

skyman ★★★
()
Ответ на: комментарий от shell-script

Ты реальность адекватно воспринимаешь? Ты топик прочитай! Там в топике есть заметка одного человека, который заметил одну особенность в том, что я написал. Эта реализация со старта некорректная т.к точка, которая является делимитером в пути директории может быть и не делимитером директории, а частью имени файла. Как ты сможешь определить, точка - это делимитер директории или часть файла? И нельзя полагаться на прыжки по точкам т.к имя файла может быть some.some.some. Единственный способ, это чекать строку сверяя, есть ли такая директория и определять где в этой строке заканчивается директория и начинается имя файла. Ты мне предлагаешь вот это фиксить и дз выполнять?

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

А ты читать умеешь? Я написал тебе, что конкретно в этой задаче с конкретно этой строкой и одной точкой проблема в скрипте учтена. Какое ТЗ, такое и решение. А ещё до этого я написал тебе, в этом топике тебе уже всё по этой задаче в комментариях пояснили. Понятное дело, что мозгов для того, чтобы понять эти десять строк кода у тебя нет. Вот теперь ты и рассказываешь тут, какой ты якобы умный.

shell-script ★★★★★
()