【问题标题】:Overwriting /boot/grub/menu.lst?覆盖/boot/grub/menu.lst?
【发布时间】:2009-11-22 09:08:42
【问题描述】:

在覆盖之前,我已将 /boot/grub/menu.lst 复制到 /home/san。我在 /home/san/menu.lst 上运行 sed 只是为了测试。

如何覆盖

默认 0

默认 1

在 sed 的帮助下。我使用了以下命令,但没有一个有效。这很可能是因为我不知道“默认”和“0”之间有多少空格。我以为有两个空格和一个制表符,但我错了。

sed -e 's/default  \t0/default  \t1/' /home/san/menu.lst
sed -e 's/default\t0/default\t1/' /home/san/menu.lst
sed -e 's/default \t0/default \t1/' /home/san/menu.lst
sed -e 's/default  0/default 1/' /home/san/menu.lst

我实际上想编写一个脚本,可以查看是否在 menu.lst 中写入了“默认 0”,然后将其替换为“默认 1”,如果写入了“默认 1”,则将其替换为“默认 2”。

谢谢

更新:

如何使用条件语句查看以'default'开头的行后面是否写了“0”或“1”?如果“0”替换为“1”,如果“1”替换为“0”?

【问题讨论】:

  • 您确实应该将您的更新作为一个单独的问题发布。 (也许解释一下用例,因为它似乎没有描述你在menu.lst...中找到的东西?)

标签: linux sed


【解决方案1】:

这对我有用(当然还有另一个文件;)

sed -re 's/^default([ \t]+)0$/default\11/' /home/san/menu.lst

工作原理:

  1. -r 传递给sed 允许我们使用扩展的正则表达式,因此无需转义括号和加号。
  2. [ \t]+ 以任意顺序匹配一个或多个制表符或空格。
  3. 用括号括起来,即([ \t]+),将它变成一个,我们可以参考。
  4. 这是本例中唯一的组,因此是\1。这就是替换字符串中发生的情况。
  5. 我们不想将default 0 替换为较大字符串的一部分。因此,我们使用^$,分别匹配行的开头和结尾。

请注意:

  1. 使用组并不是绝对必要的。您还可以选择将所有这些制表符和空格替换为单个制表符或空格。在这种情况下,只需省略括号并将\1 替换为空格:

    sed -re 's/^default[ \t]+0$/default 1/' /home/san/menu.lst
    
  2. 如果default 0 之后有尾随空格,这将失败。如果这是一个问题,那么您可以在 EOL 之前匹配 [ \t]*(零个或多个制表符和空格):

    sed -re 's/^default([ \t]+)0[ \t]*$/default\11/' /home/san/menu.lst
    

【讨论】:

  • 谢谢伙计。 :) 你能告诉我'default\11'是什么意思吗?
  • 太棒了。喜欢“团体”的东西。非常感谢。 :)
  • 感谢您的来信。能否请您再看一遍帖子。当你有空闲时间时,我已经用一个新的但相关的问题更新了它?
  • 你真的应该把它作为一个单独的问题发布。
【解决方案2】:

首先,你可以像这样使用几行:

 sed -re 's/default([ \t]*)0/default\11/' /home/san/menu.lst.

但是,你最好用这样一行:

 awk '/^default/ { if ($2 == 1) print "default  0" ; else print "default 1" } !/^default/ {print}' /boot/grub/menu.lst

【讨论】:

  • 谢谢香农。有没有办法用 awk 来查看它的“1”是否在“default”前面,然后用“0”替换它,或者如果它的“0”然后用“1”替换。或者我应该使用 IF-ELSE 语句。
  • 感谢 Shannon 帮助我。
【解决方案3】:

这用 1 代替 0,用 0 代替 1:

sed -r '/^default[ \t]+[01]$/{s/0/1/;t;s/1/0/}'

这用 1 代替 0,用 2 代替 1,用 0 代替 2:

sed -r '/^default[ \t]+[012]$/{s/0/1/;t;s/1/2/;t;s/2/0/}'

简单地说:

  • /^default[ \t]+[01]$/ 使用寻址来选择仅包含“default 0”或“default 1”(或第二种形式中的“default 2”)的行,在“default”和号码
  • s/0/1/ - 用“1”代替“0”
  • t - 如果进行了替换,则跳转到末尾,否则继续执行下一个命令
  • 随后是更多替换(和分支)

编辑

这是另一种方法:

sed -r '/^default[ \t]+[012]$/y/012/120/'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 2017-10-26
    • 2015-05-01
    • 2017-06-18
    • 2015-04-07
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多