2016-11-16 110 views
0

我正在尝试编写一个脚本,该脚本将检查以“kernel”开头的每行的/boot/grub/grub.conf的内容,如果它不包括该行中的“nousb”,它会将其添加到最后。检查多行并将字符串添加到末尾

默认情况下,我的grub.conf有两行内核,我的脚本第一次工作,并将“nousb”应用到两行的末尾。但是,为了测试从第一行删除nousb并将其保留在第二行的场景,我的脚本将认为它应用于两行,而不是将其重新应用到第一行。以下是我有

grep -w 'nousb' /boot/grub/grub.conf || sudo sed -i '/^\s*kernel/ s/$/ nousb/' /boot/grub/grub.conf 

我想它“nousb”添加到内核开始任何行缺少它,不管有多少行有它了。有什么想法吗?

只是向人们展示,我上面的脚本会在文件中添加nousb到两行具有以下:

kernel word1 word2 
kernel word3 word4 

但不是这样的:

kernel word1 word2 
kernel word3 word4 nousb 

回答

1

随着GNU sed的:

sed '/\bkernel\b/{/\bnousb\b/b;s/$/ nousb/}' file 

\b:标记字边界

b:分支结束脚本

$的:行标志结束

0

以下似乎工作:

#!/bin/bash 
while read -r line ; do 
    shopt -s extglob 
    if [[ $line == kernel* && $line != *' '[email protected](' '*|) ]] ; then 
     line+=' nousb' 
    fi 
    printf '%s\n' "$line" 
done 

条件会检查$line开始与kernel加上空间并且不包含nousb前面有空格,后面跟着空格或行尾。您可以使用它来创建一个新的文件,然后替换旧文件与它:

cp input-file input-file.backup 
./script.sh input-file > new-file 
mv new-file > input-file 
0

它与AWK相当简单:

awk '$1=="kernel" && !/\<nousb\>/{$0 = $0 OFS "nousb"} 1' file 

kernel word1 word2 nousb 
kernel word3 word4 nousb 
  • $1=="kernel"检查,如果第一个字是kernel
  • 如果
  • !/\<nousb\>/检查当前行不具有完整的单词nosub
  • $0 = $0 OFS "nousb"增加nosub在当前行的结尾
  • 1是默认操作来打印每行
相关问题