Bash: Как добавить строку в определенной строке последнего второго слова - PullRequest
0 голосов
/ 21 января 2019

Как я могу использовать bash для добавления nouveau.modeset = 0 в строку, начинающуюся с GRUB_CMDLINE_LINUX

До:

GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Ожидать:

GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet nouveau.modeset=0"
GRUB_DISABLE_RECOVERY="true"

Спасибо за вашу помощь.

=============================================== ==================

Обновление:

Извините за безрассудство, но я понятия не имею, как разрешить replace_word выводить как GRUB_CMDLINE_LINUX = "crashkernel = auto rhgb quiet nouveau.modeset = 0"

Мой код:

#!/bin/bash    
replace_word=$(....)
sed '/GRUB_CMDLINE_LINUX=/c\'"$replace_word"'' filename

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Другой подход, без обратной ссылки:

$ replace_word=' nouveau.modeset=0'
$ sed '/GRUB_CMDLINE_LINUX/ s/"$/'"$replace_word"'"/' file

Пояснения:

  • /GRUB_CMDLINE_LINUX/: если строка соответствует GRUB_CMDLINE_LINUX
  • s/"$/'"$replace_word"'"/' заменить окончание " значением $replace_word, за которым следует "
0 голосов
/ 21 января 2019

Предположим, что вы хотите заменить строку в файле file.Вы можете использовать следующее:

sed -E "s/GRUB_CMDLINE_LINUX=\"(.*)\"/GRUB_CMDLINE_LINUX=\"\1 $replace_word\"/g" file

при условии, что вы ранее сделали

replace_word="nouveau.modeset=0"

Как это работает?Вы можете увидеть структуру моего sed предложения как

sed "s/word1/word2/g" file

this s ubstutites word1 до word2 в file, изменения, сделанные g в целом.

word1 в нашем примере это GRUB_CMDLINE_LINUX=\"(.*)\", что означает захват строк, которые соответствуют GRUB_CMDLINE_LINUX= и что-то в кавычках. Группа скобок соответствует тому, к которому вы можете обратиться позже.Таким образом, мы сопоставляем указанную часть строки.Зачем?вставить его вместе с новым текстом, который вы хотите добавить.Вот что означает word2 в нашем примере.word2 равно GRUB_CMDLINE_LINUX=\"\1 $replace_word\".\1 означает содержимое первых скобок в word1, поэтому это предыдущая строка, затем вы видите пробел и переменную, которую вы хотите добавить.Обратите внимание, что я использую только двойные кавычки, потому что простые кавычки заставляют bash буквально интерпретировать строку $replace_word вместо ее оценки.

Обратите внимание, что это приводит к STD:ERR.Если вы хотите сохранить новый файл, вы можете перенаправить вывод в другой файл , перенаправление его в тот же файл уничтожит его.Если вы хотите сохранить это в тот же файл, используйте sed -i (i n место)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...