簡體   English   中英

覆蓋/boot/grub/menu.lst?

[英]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

這個怎么運作:

  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 

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

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM