Linux 是否覆盖/boot/grub/menu.lst?
在覆盖之前,我已将/boot/grub/menu.lst复制到/home/san。我在/home/san/menu.lst上运行sed只是为了测试 如何覆盖 默认值0 到 默认值1 在赛德的帮助下。我使用了以下命令,但都不起作用。这很可能是因为我不知道“default”和“0”之间有多少空格。我以为有两个空格和一个标签,但我错了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
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 0”或“default 1”(或第二种形式中的“default 2”)组成的行,在“default”和数字之间有任何非零数量的空格和/或制表符/^default[\t]+[01]$/
-用“1”代替“0”s/0/1/
-如果进行了替换,则分支到末尾,如果没有,则继续执行下一个命令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 0”或“default 1”(或第二种形式中的“default 2”)组成的行,在“default”和数字之间有任何非零数量的空格和/或制表符/^default[\t]+[01]$/
-用“1”代替“0”s/0/1/
-如果进行了替换,则分支到末尾,如果没有,则继续执行下一个命令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帮助我。你真的应该把你的更新作为一个单独的问题发布。(并且可能解释用例,因为它似乎没有描述什么