Bash:如何在倒数第二个单词的特定行添加字符串

时间:2019-01-21 09:29:51

标签: bash sed

如何使用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 :(得分:2)

另一种方法,没有反向引用:

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

说明:

  • /GRUB_CMDLINE_LINUX/:如果该行与GRUB_CMDLINE_LINUX匹配
  • s/"$/'"$replace_word"'"/'将结尾"替换为$replace_word,后跟"

答案 1 :(得分:0)

假设您要替换文件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

sword1中对word2的{​​{1}}至file的影响,是g整体上的变化。

在我们的示例中,

word1GRUB_CMDLINE_LINUX=\"(.*)\",这意味着捕获与GRUB_CMDLINE_LINUX=匹配的行和引用的内容,括号组匹配,您可以在后面引用。因此,我们匹配该行的引用部分。为什么?将其与您要添加的新文本一起粘贴。在我们的示例中,这就是word2的含义。 word2GRUB_CMDLINE_LINUX=\"\1 $replace_word\"\1表示word1中第一个括号的内容,因此它是前一个字符串,然后您会看到一个空格和要添加的变量。请注意,我仅使用双引号,因为简单的引号会强制bash照字面意义解释字符串$replace_word而不是对其求值。

请注意,这输出到STD:ERR。如果要保存新文件,可以将输出重定向到另一个文件,将其重定向到同一文件将破坏它。如果要将其保存到同一文件,请使用sed -ii个位置)