Поиск подстроки, а затем заменить строку в файле без регулярных выражений - PullRequest
0 голосов
/ 04 октября 2019

Я хочу запустить скрипт для поиска в файле /etc/bash.bashrc подстроки

PS1=

и заменить всю строку на:

 PS1='\[\e[36m\]\h\[\e[m\]\[\e[33m\]@\[\e[m\]\[\e[33m\]\u\[\e[m\]:\[\e[32m\]\W\[\e[m\]>\\$ '

Эта новая строкапредназначен для изменения командной строки.

Я пробовал и пробовал sed в bash-скрипте, но не смог правильно указать регулярное выражение.

[Редактировать] Этот код теперь работает:

#!/bin/bash

custom_prompt='${debian_chroot:+($debian_chroot)}\[\e[36;40m\]\u\[\e[m\]\[\e[93m\]@\[\e[m\]\[\e[36m\]\h\[\e[m\]:\[\e[92m\]\w\[\e[m\]\[\e[92m\]\\$\[\e[m\]\[\e[93m\]>\[\e[m\]\'

### Setup Bash Prompt
# replace each \ for double \\ in the prompt string
sed_custom_prompt=$(<<<"$custom_prompt" sed 's/\\/\\\\/g')

# add this to  /etc/bashrc for global effect
sed  -i "s/PS1=.*/PS1=\"$sed_custom_prompt\"/" testrc

Единственная проблема заключается в том, что он выполняет PS1= " string " вместо PS1 = ' string ' с обратными тиками.

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

Мне все равно, является ли это perl, awk или bash. Мне просто нужно что-то, что работает.

Ответы [ 3 ]

1 голос
/ 04 октября 2019

Вместо написания сценариев для замены существующего PS1 шутка его перезаписать будет гораздо проще.

echo PS1="This is my prompt" >> /etc/bash.bashrc

Это добавит новый PS1 в конец файла, и с этого момента он будетперезаписать инициализацию PS1 по умолчанию.

0 голосов
/ 04 октября 2019

Попробуйте это:

replace='PS1="\[\e[36m\]\h\[\e[m\]\[\e[33m\]@\[\e[m\]\[\e[33m\]\u\[\e[m\]:\[\e[32m\]\W\[\e[m\]>\\$ "'
perl -i -spe 's/^PS1=.*$/$repl/' -- -repl="$replace" -- /etc/bash.bashrc

Примечание. Возможно, удалите -i (редактирование на месте) при первом запуске, чтобы проверить, работает ли оно.

0 голосов
/ 04 октября 2019

Вы должны убегать каждые \, чтобы убедиться, что они не потеряны.

РЕДАКТИРОВАТЬ: строка PS1 также должна быть заключена в двойные кавычки.


$ custom_prompt="\[\e[36m\]\h\[\e[m\]\[\e[33m\]@\[\e[m\]\[\e[33m\]\u\[\e[m\]:\[\e[32m\]\W\[\e[m\]>\\$ "
$ sed_custom_prompt=$(<<<"$custom_prompt" sed 's/\\/\\\\/g')
$ sed -i "s/PS1=.*/PS1=\"$sed_custom_prompt\"/" testrc
$ source testrc
laptop@user:~>$

Следующий код работает на моем ноутбуке. Проблема заключалась в последнем \ символе в строке вашей PS1 переменной (я ее удалил):

#! /bin/bash
custom_prompt='${debian_chroot:+($debian_chroot)}\[\e[36;40m\]\u\[\e[m\]\[\e[93m\]@\[\e[m\]\[\e[36m\]\h\[\e[m\]:\[\e[92m\]\w\[\e[m\]\[\e[92m\]\\$\[\e[m\]\[\e[93m\]>\[\e[m\] '

### Setup Bash Prompt
# replace each \ for double \\ in the prompt string
sed_custom_prompt=$(<<<"$custom_prompt" sed 's/\\/\\\\/g')

# add this to  /etc/bashrc for global effect
sed -i  "s/PS1=.*/PS1='$sed_custom_prompt'/" testrc

exit 0

ps. Мне лично нравится добавлять время в PS1, чтобы я знал, как давнокоманда завершена. Кроме того, вы можете сразу отсчитать время, если добавите его (\D{%H}:\D{%M}).

...