Здравейте! Вероятно използвате блокиращ рекламите софтуер. В това няма нищо нередно, много хора го правят.

     Но за да помогнете този сайт да съществува и за да имате достъп до цялото съдържание, моля, изключете блокирането на рекламите.

  Ако не знаете как, кликнете тук

Помощ за команда за добавяне на текст към файл  [РЕШЕНА]

feed Всичко свързано с Линукс. Новини, проблеми, въпроси.
Десктоп Линукс дистибуции, сървърни Линукс дистрибуции, Линукс дистрибуции с общо предназначение, Linux Mint, Ubuntu, Arch Linux, Mandriva, PCLinuxOS, openSUSE, Fedora, Red Hat Enterprise Linux, CentOS, Suse Linux Enterprise Server, Debian, Cross Linux from Scratch, Slackware, Gentoo. Графични среди, новини, игри, драйвъри, въпроси, десктоп, сървър, браузъри, помощ.
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Помощ за команда за добавяне на текст към файл

Мнение от Alfonsu »

Здравейте!
Търся възможно най простата команда за следното:
Искам да добавя текст във файл, обаче първо да се провери дали текста го има и ако той липсва да бъде добавен.
Пример:
Проверява се във $HOME/.config/kcminputrc дали има ред с "[Keyboard]" и ако няма, да се добавя автоматично
Идеята е да си направя скипт в който да напиша всчики настройки които искам да се добавят към конфигурационните файлове на плазма, обаче за да няма повтаряне, първо да се проверява.
По принцип работя със "sed" обаче никъде не намерих начин в който той може това.
Прочетено: 962 пъти
Аватар
tmp_ZMx2fK6aL4
Ветеран
Ветеран
Мнения: 1023
Регистриран на: Пон Фев 21, 2022 15:29
Репутация: 10504
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от tmp_ZMx2fK6aL4 »

Погледнах структурата:
https://github.com/MatMoul/plasma-confi ... kcminputrc

Това дето го искаш няма как да стане тривиално. Имаш групи от свойства със стойности.
Или трябва да минеш през база данни - sqlite примерно, или директно програмно през set с hashtable/dictionary.

За bash скрипт - забрави.
Hardware: Windows 11 Incompatible Certified!
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Alfonsu »

Аз искам да поверявам и добавям само тези които искам. Другите ме интерсуват.
В главата ми се върти следното
Задавам условие:
Ако във фаила kcminputrc няма [Keyboard] то нека го добави. След това проверявам за NumLock=0 и ако го няма нека го добави на следващия ред под [Keyboard] и така няма да има никакъв проблем. Аз описвам всичко стъпка по стъпка с точност. То само да го нарпави. И така за всяко действие ще си има последователност.
Аватар
tmp_ZMx2fK6aL4
Ветеран
Ветеран
Мнения: 1023
Регистриран на: Пон Фев 21, 2022 15:29
Репутация: 10504
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от tmp_ZMx2fK6aL4 »

Ще бъде неефективен алгоритъм.
1. За всяко нещо, което добавяш ще трябва да проверяваш 2 неща: съществуването на конкретния ключ един път и 2-ри път да определиш позицията във файла за секцията където го слагаш.
2. Не отчиташ и други варианти:
- секцията я има, ключът го няма;
- ключът го има, коя му стойност е с приоритет - старата или новата?
3. Не ми стана ясно - ред по ред ръчно ли ще добавяш ключовете в loop в скрипт или ще правиш bulk merge на два конфигурационно структурирани файла?
- ако е първият - трябва да му задаваш и секцията за всеки ключ на въвеждащия ред или да итерираш по създаден с такава структура файл.

Алгоритъм с доста IF и възможности за грешки. Също бавен, защото ще правиш цялостен презапис на конф. файла за всеки ключ.

Но щом те влече през BASH...
- за търсене на ключа - GREP;
- за определяне на позицията за вмъкване във файла POS=GREP-1 на следващата секция;
- за вмъкване на новия ключ и стойност SED=POS
Hardware: Windows 11 Incompatible Certified!
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Alfonsu »

Не ми е проблем алгоритъма да не е от най ефективините, защото промените който правя не са много
1.Не мисля че проверката на ключ/дума е проблем в случая.
2.Секцията като я има, значи си остава, ключа ако го има то значи е с желата стойност от мен и не се пипа.
3.Сега ще споделя скрипта който изплзвам в мометна.

Код за потвърждение: Избери целия код

#!/bin/bash

sudo pacman -S dialog --needed

cmd=(dialog --cancel-label "Exit" --title "Setup Plasma Pure" --separate-output --checklist "Select options:" 23 111 17)
options=(
1 "System Settings - Swich to Icon View" on
2 "System Settings - Apperance - Window Decoration - Titlebar Buttons - Disable Context help" on
3 "System Settings - Apperance - Disable Splash Screen" on
4 "System Settings - Workpace Behavioor - General Behavior - Animation Speed +1" on
5 "System Settings - Workpace Behavioor - General Behavior - Open Files With Duble Click" on
6 "System Settings - Workpace Behavioor - Disable Screen Locking After 5min" on
7 "System Settings - Disable Screen Locking After Waking From Sleep" on
8 "System Settings - Shortcuts - Add Konsole to Open With Ctrl+Alt+T" on
9 "System Settings - Shortcuts - KWin - Suspend Compositing - Change Default Shortcut to Ctrl+Alt+E " on
10 "System Settings - Startup and Shutdown - Desktop Session - Start with an empty session " on
11 "System Settings - Inpute Devices - Keyboard - Enable Numlock on Plasma Startup" on
12 "System Settings - Inpute Devices - Keyboard - Loyauts - Enable Configure Loyauts" on
13 "System Settings - Inpute Devices - Keyboard - Loyauts - Add Bulgarian Traditional Phonetic" on
14 "System Settings - Inpute Devices - Keyboard - Advanced - Enable Configure keyboard options" on
15 "System Settings - Inpute Devices - Keyboard - Advanced - Enable Key sequence to kill the X server" on
16 "System Settings - Inpute Devices - Keyboard - Advanced - Enable Switching to another layout" on
)
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
clear
for choice in $choices
do
case $choice in
1)
echo >> $HOME/.config/systemsettingsrc
echo [Main] >> $HOME/.config/systemsettingsrc
echo ActiveView=systemsettings_icon_mode >> $HOME/.config/systemsettingsrc
;;
2)
echo >> $HOME/.config/kwinrc
echo [org.kde.kdecoration2] >> $HOME/.config/kwinrc
echo ButtonsOnRight=IAX >> $HOME/.config/kwinrc
;;
3)
rm -f $HOME/.config/ksplashrc
echo [KSplash] >> $HOME/.config/ksplashrc
echo Engine=none >> $HOME/.config/ksplashrc
echo Theme=None >> $HOME/.config/ksplashrc
;;
4)
echo >> $HOME/.config/kdeglobals
echo [KDE] >> $HOME/.config/kdeglobals
echo AnimationDurationFactor=0.7071067811865475 >> $HOME/.config/kdeglobals
;;
5)
echo >> $HOME/.config/kdeglobals
echo [KDE] >> $HOME/.config/kdeglobals
echo SingleClick=false >> $HOME/.config/kdeglobals
;;
6)
echo >> $HOME/.config/kscreenlockerrc
echo [Daemon] >> $HOME/.config/kscreenlockerrc
echo Autolock=false >> $HOME/.config/kscreenlockerrc
;;
7)
echo >> $HOME/.config/kscreenlockerrc
echo [Daemon] >> $HOME/.config/kscreenlockerrc
echo LockOnResume=false >> $HOME/.config/kscreenlockerrc
;;
8)
echo >> $HOME/.config/kglobalshortcutsrc
echo [org.kde.konsole.desktop] >> $HOME/.config/kglobalshortcutsrc
echo NewTab=none,none,Open a New Tab >> $HOME/.config/kglobalshortcutsrc
echo NewWindow=none,none,Open a New Window >> $HOME/.config/kglobalshortcutsrc
echo _k_friendly_name=Konsole >> $HOME/.config/kglobalshortcutsrc
echo _launch=Ctrl+Alt+T,Ctrl+Alt+T,Konsole >> $HOME/.config/kglobalshortcutsrc
;;
9)
sed -i '/Suspend Compositing=/c\Suspend Compositing=Ctrl+Alt+E,Alt+Shift+F12,Suspend Compositing' $HOME/.config/kglobalshortcutsrc
;;
10)
echo >> $HOME/.config/ksmserverrc
echo [General] >> $HOME/.config/ksmserverrc
echo loginMode=emptySession >> $HOME/.config/ksmserverrc
;;
11)
echo >> $HOME/.config/kcminputrc
echo [Keyboard] >> $HOME/.config/kcminputrc
echo NumLock=0 >> $HOME/.config/kcminputrc
;;
12)
echo >> $HOME/.config/kxkbrc
echo [Layout] >> $HOME/.config/kxkbrc
echo Options= >> $HOME/.config/kxkbrc
echo LayoutList=us >> $HOME/.config/kxkbrc
echo Use=true >> $HOME/.config/kxkbrc
;;
13)
echo DisplayNames=, >> $HOME/.config/kxkbrc
echo VariantList=,phonetic >> $HOME/.config/kxkbrc
sed -i 's/us/us,bg/g' $HOME/.config/kxkbrc
;;
14)
echo ResetOldOptions=true >> $HOME/.config/kxkbrc
;;
15)
sed -i '0,/Options=/s//Options=terminate:ctrl_alt_bksp,/' $HOME/.config/kxkbrc
;;
16)
sed -i '0,/Options=/s//Options=grp:alt_shift_toggle,/' $HOME/.config/kxkbrc
;;
esac
done
case "$ret" in
*) exit ;;
esac

Аватар
tmp_ZMx2fK6aL4
Ветеран
Ветеран
Мнения: 1023
Регистриран на: Пон Фев 21, 2022 15:29
Репутация: 10504
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от tmp_ZMx2fK6aL4 »

Не разбрах много смисъла на този скрипт като идея - програмно да се разписват ключове/стойности в конфигурационни текстови файлове?
Както и да е, не мисля да ти ставам QA на скрипта.
Но за последен коментар ще споделя какво видях/не видях в него:
- ще работи коректно само първия път, след това ще имаш мултиплициране на съдържание/секции/ключове от 1-8, 10-14;
- bash e милостив и последното присвояване на ключ/променлива е валидното, но ти ще променяш само първото в 15-16. При това така ще го променяш, че ще удължаваш стойността на ключа всеки път;
- никакви проверки за предишно и/или валидно състояние няма, както и за успешни операции;
- никакви обработки на грешки няма.

Спирам дотук, но ти не се отчайвай. O:)
Успех в BASH дерзанията ти.
Hardware: Windows 11 Incompatible Certified!
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Alfonsu »

Да, този скрипт в този си вид е валиден само за първоначална настройка, след това той губи сила. Затова мисля начин който е по силите ми за да го подобря и да е годен за многократна употреба. До преди това правих резервно копие на всички файлове в който участват промени от мен и при нужда ги заменях с оригиналните. Само че това изисква периодични обновяване на конфигурационните файлове за да са актуални.
Аватар
Zeroadhesion
       
Мнения: 19436
Регистриран на: Нед Апр 13, 2008 18:33
Репутация: 42022
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Zeroadhesion »

Alfonsu написа: Пет Сеп 16, 2022 13:41 Проверява се във $HOME/.config/kcminputrc дали има ред с "[Keyboard]" и ако няма, да се добавя автоматично

Код за потвърждение: Избери целия код

#!/bin/bash

if [ "$(grep "\[Keyboard\]" $HOME/.config/kcminputrc)" == "[Keyboard]" ] ; then
    echo "[Keyboard] already exists."
else
    echo "[Keyboard]" >> $HOME/.config/kcminputrc
fi
Аватар
beggginer
Доктор
Доктор
Мнения: 6684
Регистриран на: Нед Апр 13, 2008 18:33
Репутация: 38324
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от beggginer »

Най-простото решение почти винаги е и най-доброто.

Occam’s razor
Как да си върнем контрола над Windows 10 Home :violent1:
Изображение
Валсо написа: Съб Яну 21, 2023 12:28 Знам какво правя.
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Alfonsu »

Zeroadhesion написа: Съб Сеп 17, 2022 01:07
Alfonsu написа: Пет Сеп 16, 2022 13:41 Проверява се във $HOME/.config/kcminputrc дали има ред с "[Keyboard]" и ако няма, да се добавя автоматично

Код за потвърждение: Избери целия код

#!/bin/bash

if [ "$(grep "\[Keyboard\]" $HOME/.config/kcminputrc)" == "[Keyboard]" ] ; then
    echo "[Keyboard] already exists."
else
    echo "[Keyboard]" >> $HOME/.config/kcminputrc
fi
Супер!
Това работи перфектно, само че смених
echo "[Keyboard] already exists." със sed -i '/NumLock=/c\' $HOME/.config/kcminputrc, понеже не ми трябва обратен отговор а и така след като провери и види че има [Keyboard] то значи има вероятност да има някоя настройка свързана със Numlock, затова веднага след това пускам sed да изтрие целия ред при сходство.
Всичко точно, обаче остана само едно нещо за да е решена задача на 100%
И то е как да добавя NumLock=1 веднага под [Keyboard], така няма как да се обърка структурата на всички команди свързани с [Keyboard]
За сега примера ми изглежда така:

Код за потвърждение: Избери целия код

#!/bin/bash

if [ "$(grep "\[Keyboard\]" $HOME/.config/kcminputrc)" == "[Keyboard]" ] ; then
    sed -i '/NumLock=/c\' $HOME/.config/kcminputrc
else
    echo "[Keyboard]" >> $HOME/.config/kcminputrc
fi
Аватар
Zeroadhesion
       
Мнения: 19436
Регистриран на: Нед Апр 13, 2008 18:33
Репутация: 42022
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Zeroadhesion »

Код за потвърждение: Избери целия код

#!/bin/bash

if [ "$(grep "\[Keyboard\]" $HOME/.config/kcminputrc)" == "[Keyboard]" ] ; then
    sed -i '/NumLock=/c\' $HOME/.config/kcminputrc
    sed -i "s/\[Keyboard\]/\[Keyboard\]\\nNumLock=1/g" $HOME/.config/kcminputrc
else
    echo -e "[Keyboard]\nNumLock=1" >> $HOME/.config/kcminputrc
fi
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл  [РЕШЕНА]

Мнение от Alfonsu »

Много благодаря за помощта!
Аз обаче измислих една идея по кратък вариант :)
Ето го и него:

Код за потвърждение: Избери целия код

if [ "$(grep "\[Keyboard\]" $HOME/.config/kcminputrc)" == "[Keyboard]" ] ; then
    sed -i '/NumLock=/d' $HOME/.config/kcminputrc
else
    echo "[Keyboard]" >> $HOME/.config/kcminputrc
fi
sed -i '/\[Keyboard\]/a\NumLock=0' $HOME/.config/kcminputrc
И с това темата е решена.
Аватар
Zeroadhesion
       
Мнения: 19436
Регистриран на: Нед Апр 13, 2008 18:33
Репутация: 42022
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Zeroadhesion »

И твоя бачка, браво :)
Alfonsu
Редовен потребител
Редовен потребител
Мнения: 195
Регистриран на: Сря Сеп 16, 2015 17:16
Репутация: 1020
пол: Мъж

Re: Помощ за команда за добавяне на текст към файл

Мнение от Alfonsu »

Иии за да е още по красиво, добавяме още един ред който добавя разстояние между [Keyboard] ако го няма, за да е отделен от другите, точно както plasma го прави фабрично :)

Код за потвърждение: Избери целия код

if [ "$(grep "\[Keyboard\]" $HOME/.config/kcminputrc)" == "[Keyboard]" ] ; then
    sed -i '/NumLock=/d' $HOME/.config/kcminputrc
else
    echo >> $HOME/.config/kcminputrc
    echo "[Keyboard]" >> $HOME/.config/kcminputrc
fi
sed -i '/\[Keyboard\]/a\NumLock=0' $HOME/.config/kcminputrc
Нова тема Публикувай отговор

  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Линукс - инсталация, настройки, проблеми”