LINUX.ORG.RU

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

 


0

1

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

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

строку 
someString="yes"

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

★★★

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

Аудит, проставь в скрипт:

VAR='lib.systemd.system-sleep.firefox.sleep1.sleep2.vasyapetya="yes"'

О чем я выше писал

VAR='lib.systemd.system-sleep.firefox.sleep1.sleep2.vasyapetya="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} == 4 ]]
    then
        FILENAME="${FILENAME}/${PATH[-3]}.${PATH[-2]}"
        echo ${PATH[-1]} >> ${FILENAME}
        exit 0
    fi
done

out:

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

cat /lib/systemd/system-sleep/firefox.sleep1.sleep2
#!/usr/bin/env bash
vasyapetya

Ты даже протестить не мог свою поделку как следует. Я без теста визуально сказал об этом

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

В догонку. Там настолько легаси, что помимо шеллов был код на perl 5.001(это если что 95-ый год). Его, кстати, перенесли почти без изменений на 5.24. Понадобилось только поправить вызовы open() и заменить «глобы» на нормальные переменные.

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

Ты таки читать не умеешь. О чём ещё с тобой можно разговаривать? Мне третий раз повторять что ли про условие, которое обрабатывается в соответсвии с твоей строкой в стартовом посте?

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

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

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

И ты заметил, что у топика есть статус «решено». Это означает…это означает? Что это означает? Для тебя, гуру баша, я могу по-секрету сказать, что я уже понял как всё делать. И конечная реализация совершенно другая, нежели описано в шапке и во всём топике

После этого сообщения ты мне опять будешь предлагать что-то поправить в твоём скрипте?

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

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

А ты так и не научился читать. Я же тебе с самого начала привёл этот топик как пример глупых вопросов с твоей стороны. И написал, что тут тебе это уже объяснили.

shell-script ★★★★★
()
>>> attr = "lib.systemd.system-sleep.firefox.sleep.someString=\"yes\""
>>> attr.rsplit('.', 1)
['lib.systemd.system-sleep.firefox.sleep', 'someString="yes"']
>>> path, assign = attr.rsplit('.', 1)
>>> import os
>>> from pathlib import Path
>>> path=Path(path.replace('.', os.sep))
>>> path
PosixPath('lib/systemd/system-sleep/firefox/sleep')
>>> contents=["foo=bar"]
>>> var, _ = assign.split("=")
>>> var
'someString'
>>> contents=["someString=42", "foo=bar"]
>>> contents=list(filter(lambda line: line.split('=')[0] != var, contents))
>>> contents
['foo=bar']

а там readlines=list(fp), а потом seek(0), truncate(0), writelines(contents)

uwuwuu
()