Здравейте! Вероятно използвате блокиращ рекламите софтуер. В това няма нищо нередно, много хора го правят. |
Но за да помогнете този сайт да съществува и за да имате достъп до цялото съдържание, моля, изключете блокирането на рекламите. |
| Ако не знаете как, кликнете тук |
Помощ за команда за добавяне на текст към файл [РЕШЕНА]
-
Alfonsu
- Редовен потребител

- Мнения: 195
- Регистриран на: Сря Сеп 16, 2015 17:16
- Репутация: 1020
- пол: Мъж
Помощ за команда за добавяне на текст към файл
Здравейте!
Търся възможно най простата команда за следното:
Искам да добавя текст във файл, обаче първо да се провери дали текста го има и ако той липсва да бъде добавен.
Пример:
Проверява се във $HOME/.config/kcminputrc дали има ред с "[Keyboard]" и ако няма, да се добавя автоматично
Идеята е да си направя скипт в който да напиша всчики настройки които искам да се добавят към конфигурационните файлове на плазма, обаче за да няма повтаряне, първо да се проверява.
По принцип работя със "sed" обаче никъде не намерих начин в който той може това.
Прочетено: 962 пъти
Търся възможно най простата команда за следното:
Искам да добавя текст във файл, обаче първо да се провери дали текста го има и ако той липсва да бъде добавен.
Пример:
Проверява се във $HOME/.config/kcminputrc дали има ред с "[Keyboard]" и ако няма, да се добавя автоматично
Идеята е да си направя скипт в който да напиша всчики настройки които искам да се добавят към конфигурационните файлове на плазма, обаче за да няма повтаряне, първо да се проверява.
По принцип работя със "sed" обаче никъде не намерих начин в който той може това.
- tmp_ZMx2fK6aL4
- Ветеран

- Мнения: 1023
- Регистриран на: Пон Фев 21, 2022 15:29
- Репутация: 10504
- пол: Мъж
Re: Помощ за команда за добавяне на текст към файл
Погледнах структурата:
https://github.com/MatMoul/plasma-confi ... kcminputrc
Това дето го искаш няма как да стане тривиално. Имаш групи от свойства със стойности.
Или трябва да минеш през база данни - sqlite примерно, или директно програмно през set с hashtable/dictionary.
За bash скрипт - забрави.
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: Помощ за команда за добавяне на текст към файл
Аз искам да поверявам и добавям само тези които искам. Другите ме интерсуват.
В главата ми се върти следното
Задавам условие:
Ако във фаила kcminputrc няма [Keyboard] то нека го добави. След това проверявам за NumLock=0 и ако го няма нека го добави на следващия ред под [Keyboard] и така няма да има никакъв проблем. Аз описвам всичко стъпка по стъпка с точност. То само да го нарпави. И така за всяко действие ще си има последователност.
В главата ми се върти следното
Задавам условие:
Ако във фаила kcminputrc няма [Keyboard] то нека го добави. След това проверявам за NumLock=0 и ако го няма нека го добави на следващия ред под [Keyboard] и така няма да има никакъв проблем. Аз описвам всичко стъпка по стъпка с точност. То само да го нарпави. И така за всяко действие ще си има последователност.
- tmp_ZMx2fK6aL4
- Ветеран

- Мнения: 1023
- Регистриран на: Пон Фев 21, 2022 15:29
- Репутация: 10504
- пол: Мъж
Re: Помощ за команда за добавяне на текст към файл
Ще бъде неефективен алгоритъм.
1. За всяко нещо, което добавяш ще трябва да проверяваш 2 неща: съществуването на конкретния ключ един път и 2-ри път да определиш позицията във файла за секцията където го слагаш.
2. Не отчиташ и други варианти:
- секцията я има, ключът го няма;
- ключът го има, коя му стойност е с приоритет - старата или новата?
3. Не ми стана ясно - ред по ред ръчно ли ще добавяш ключовете в loop в скрипт или ще правиш bulk merge на два конфигурационно структурирани файла?
- ако е първият - трябва да му задаваш и секцията за всеки ключ на въвеждащия ред или да итерираш по създаден с такава структура файл.
Алгоритъм с доста IF и възможности за грешки. Също бавен, защото ще правиш цялостен презапис на конф. файла за всеки ключ.
Но щом те влече през BASH...
- за търсене на ключа - GREP;
- за определяне на позицията за вмъкване във файла POS=GREP-1 на следващата секция;
- за вмъкване на новия ключ и стойност SED=POS
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: Помощ за команда за добавяне на текст към файл
Не ми е проблем алгоритъма да не е от най ефективините, защото промените който правя не са много
1.Не мисля че проверката на ключ/дума е проблем в случая.
2.Секцията като я има, значи си остава, ключа ако го има то значи е с желата стойност от мен и не се пипа.
3.Сега ще споделя скрипта който изплзвам в мометна.
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: Помощ за команда за добавяне на текст към файл
Не разбрах много смисъла на този скрипт като идея - програмно да се разписват ключове/стойности в конфигурационни текстови файлове?
Както и да е, не мисля да ти ставам QA на скрипта.
Но за последен коментар ще споделя какво видях/не видях в него:
- ще работи коректно само първия път, след това ще имаш мултиплициране на съдържание/секции/ключове от 1-8, 10-14;
- bash e милостив и последното присвояване на ключ/променлива е валидното, но ти ще променяш само първото в 15-16. При това така ще го променяш, че ще удължаваш стойността на ключа всеки път;
- никакви проверки за предишно и/или валидно състояние няма, както и за успешни операции;
- никакви обработки на грешки няма.
Спирам дотук, но ти не се отчайвай.
Успех в BASH дерзанията ти.
Както и да е, не мисля да ти ставам QA на скрипта.
Но за последен коментар ще споделя какво видях/не видях в него:
- ще работи коректно само първия път, след това ще имаш мултиплициране на съдържание/секции/ключове от 1-8, 10-14;
- bash e милостив и последното присвояване на ключ/променлива е валидното, но ти ще променяш само първото в 15-16. При това така ще го променяш, че ще удължаваш стойността на ключа всеки път;
- никакви проверки за предишно и/или валидно състояние няма, както и за успешни операции;
- никакви обработки на грешки няма.
Спирам дотук, но ти не се отчайвай.
Успех в BASH дерзанията ти.
Hardware: Windows 11 Incompatible Certified!
-
Alfonsu
- Редовен потребител

- Мнения: 195
- Регистриран на: Сря Сеп 16, 2015 17:16
- Репутация: 1020
- пол: Мъж
Re: Помощ за команда за добавяне на текст към файл
Да, този скрипт в този си вид е валиден само за първоначална настройка, след това той губи сила. Затова мисля начин който е по силите ми за да го подобря и да е годен за многократна употреба. До преди това правих резервно копие на всички файлове в който участват промени от мен и при нужда ги заменях с оригиналните. Само че това изисква периодични обновяване на конфигурационните файлове за да са актуални.
- Zeroadhesion
- Мнения: 19436
- Регистриран на: Нед Апр 13, 2008 18:33
- Репутация: 42022
- пол: Мъж
Re: Помощ за команда за добавяне на текст към файл
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
Re: Помощ за команда за добавяне на текст към файл
Най-простото решение почти винаги е и най-доброто.
Occam’s razor
Occam’s razor
-
Alfonsu
- Редовен потребител

- Мнения: 195
- Регистриран на: Сря Сеп 16, 2015 17:16
- Репутация: 1020
- пол: Мъж
Re: Помощ за команда за добавяне на текст към файл
Супер!Zeroadhesion написа: Съб Сеп 17, 2022 01:07Alfonsu написа: Пет Сеп 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: Помощ за команда за добавяне на текст към файл
Код за потвърждение: Избери целия код
#!/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: Помощ за команда за добавяне на текст към файл [РЕШЕНА]
Много благодаря за помощта!
Аз обаче измислих една идея по кратък вариант
Ето го и него:
И с това темата е решена.
Аз обаче измислих една идея по кратък вариант
Ето го и него:
Код за потвърждение: Избери целия код
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: Помощ за команда за добавяне на текст към файл
И твоя бачка, браво 
-
Alfonsu
- Редовен потребител

- Мнения: 195
- Регистриран на: Сря Сеп 16, 2015 17:16
- Репутация: 1020
- пол: Мъж
Re: Помощ за команда за добавяне на текст към файл
Иии за да е още по красиво, добавяме още един ред който добавя разстояние между [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
-
- Подобни теми
- Отговори
- Преглеждания
- Последно мнение
-
-
Бъдещето е тук: Робот стреля по човек след определена команда (ВИДЕО)
от Mozo » Вто Дек 02, 2025 15:05 » в Любопитни новини - 0 Отговори
- 97 Преглеждания
-
Последно мнение от Mozo
Вто Дек 02, 2025 15:05
-
-
-
Добавяне на хранилищата на CachyOS към съществуваща Arch Linux инсталация
от Mozo » Нед Юни 22, 2025 18:34 » в Линукс - инсталация, настройки, проблеми - 11 Отговори
- 1463 Преглеждания
-
Последно мнение от Fernando Sucre
Чет Авг 07, 2025 13:40
-
-
- 11 Отговори
- 168 Преглеждания
-
Последно мнение от Mozo
Сря Фев 04, 2026 14:43
-
- 2 Отговори
- 162 Преглеждания
-
Последно мнение от Валсо
Нед Дек 14, 2025 09:59
-
-
Съдът отмени ключов текст за оценките от матурите
от Mozo » Чет Апр 23, 2026 12:50 » в Любопитни новини - 0 Отговори
- 5 Преглеждания
-
Последно мнение от Mozo
Чет Апр 23, 2026 12:50
-

