Linux 是否覆盖/boot/grub/menu.lst?

Linux 是否覆盖/boot/grub/menu.lst?,linux,sed,Linux,Sed,在覆盖之前,我已将/boot/grub/menu.lst复制到/home/san。我在/home/san/menu.lst上运行sed只是为了测试 如何覆盖 默认值0 到 默认值1 在赛德的帮助下。我使用了以下命令,但都不起作用。这很可能是因为我不知道“default”和“0”之间有多少空格。我以为有两个空格和一个标签,但我错了 sed -e 's/default \t0/default \t1/' /home/san/menu.lst sed -e 's/default\t0/defaul

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

如何覆盖

默认值0

默认值1

在赛德的帮助下。我使用了以下命令,但都不起作用。这很可能是因为我不知道“default”和“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中是否写入了“default 0”,然后将其替换为“default 1”,如果写入了“default 1”,则将其替换为“default 2”

谢谢

更新:

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

这对我来说很有效(当然是另一个文件;)

工作原理:

  • -r
    传递到允许我们使用扩展正则表达式,因此无需转义括号和加号
  • [\t]+
    以任意顺序匹配一个或多个制表符或空格
  • 将括号括起来,即
    ([\t]+)
    ,将其转换为一个组,我们可以参考该组
  • 这是这种情况下的唯一组,因此
    \1
    。这就是替换字符串中发生的情况
  • 我们不希望将
    默认值0
    替换为较大字符串的一部分。因此,我们使用
    ^
    $
    ,它们分别匹配行的开始和结束
  • 注意:

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

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

    sed -re 's/^default([ \t]+)0[ \t]*$/default\11/' /home/san/menu.lst
    
  • 这对我来说很有用(当然,还有另一个文件;)

    工作原理:

  • -r
    传递到允许我们使用扩展正则表达式,因此无需转义括号和加号
  • [\t]+
    以任意顺序匹配一个或多个制表符或空格
  • 将括号括起来,即
    ([\t]+)
    ,将其转换为一个组,我们可以参考该组
  • 这是这种情况下的唯一组,因此
    \1
    。这就是替换字符串中发生的情况
  • 我们不希望将
    默认值0
    替换为较大字符串的一部分。因此,我们使用
    ^
    $
    ,它们分别匹配行的开始和结束
  • 注意:

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

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

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

  • 首先,您可以使用以下几行:

     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
    

    首先,您可以使用以下几行:

     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
    

    这将用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/'
    

    这将用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/'
    

    谢谢,先生你能告诉我“默认\11”是什么意思吗?太棒了。喜欢“集体”的东西。非常感谢。:)谢谢你的来信。请你再看一遍这篇文章好吗。当你有空的时候,我用一个新的但相关的问题更新了它?你真的应该把它作为一个单独的问题发布。谢谢你。)你能告诉我“默认\11”是什么意思吗?太棒了。喜欢“集体”的东西。非常感谢。:)谢谢你的来信。请你再看一遍这篇文章好吗。当你有空的时候,我用一个新的但相关的问题更新了它。你真的应该把它作为一个单独的问题发布。谢谢Shannon。awk是否有办法查看其“1”是否位于“default”之前,然后将其替换为“0”,或者如果其“0”则替换为“1”。或者我应该使用IF-ELSE语句。谢谢Shannon帮助我。谢谢Shannon。awk是否有办法查看其“1”是否位于“default”之前,然后将其替换为“0”,或者如果其“0”则替换为“1”。或者我应该使用IF-ELSE语句。谢谢Shannon帮助我。你真的应该把你的更新作为一个单独的问题发布。(并且可能解释用例,因为它似乎没有描述什么