[英]Overwriting /boot/grub/menu.lst?
在覆蓋之前,我已將/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中寫入了“ default 0”,然后將其替換為“ default 1”,如果寫入了“ default 1”,則將其替換為“ default 2”。
謝謝
更新:
如何使用條件語句查看以'default'開頭的行后面是否寫有“ 0”或“ 1”? 如果將“ 0”替換為“ 1”,如果將“ 1”替換為“ 0”?
這對我有用(當然還有另一個文件;)
sed -re 's/^default([ \t]+)0$/default\11/' /home/san/menu.lst
這個怎么運作:
-r
傳遞給sed
允許我們使用擴展的正則表達式,因此無需轉義括號和加號。 [ \\t]+
以任意順序匹配一個或多個制表符或空格。 ([ \\t]+)
,將其變成一個組 ,我們可以參考該組 。 \\1
。 這就是替換字符串中發生的情況。 default 0
替換為較大字符串的一部分。 因此,我們使用^
和$
,分別匹配行的開始和結束。 注意:
使用組不是絕對必要的。 您還可以選擇將所有這些選項卡和空格替換為單個選項卡或空格。 在這種情況下,只需省略括號並用空格替換\\1
:
sed -re 's/^default[ \\t]+0$/default 1/' /home/san/menu.lst
如果default 0
后面有空格,則此操作將失敗。 如果這是一個問題,則可以在EOL之前匹配[ \\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
這將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”)組成的行,且空格數量不為零和/或“默認”和數字之間的制表符 s/0/1/
-用“ 1”代替“ 0” t
如果進行了替換,則分支到最后,如果沒有,則繼續執行下一個命令 編輯 :
這是另一種方法:
sed -r '/^default[ \t]+[012]$/y/012/120/'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.