2009-11-22 5 views
1

Перед переписыванием я скопировал /boot/grub/menu.lst в/home/san. Я запускаю sed на /home/san/menu.lst только для тестирования.Перезапись /boot/grub/menu.lst?

Как я могу переписать

по умолчанию 0

в

по умолчанию 1

с помощью СЭД. Я использовал следующие команды, но никто не работал. Скорее всего, потому, что я не знаю, сколько пробелов существует между «по умолчанию» и «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 

Я на самом деле хочу, чтобы написать сценарий, который может видеть, если «по умолчанию 0» записывается в menu.lst затем заменить его «по умолчанию» 1, и если «по умолчанию» 1 записывается затем заменить его «по умолчанию 2' .

Благодаря

Update:

Как используется условный оператор, чтобы увидеть, если строка начинается с «по умолчанию» имеет «0» или «1», написанной после него? Если «0» заменить на «1», а если «1» заменить его на «0»?

+0

Вы действительно должны обновлять свое как ** отдельный ** вопрос. (И, возможно, объясните пример использования, поскольку он, похоже, не описывает что-то, что вы найдете в 'menu.lst' ...?) – Stephan202

ответ

4

Это работает для меня (с другим файлом, конечно,)

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. Если это является проблемой, то вы можете сопоставить [ \t]* (ноль или больше вкладок и пробелы) непосредственно перед оконечным резистором:

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

Спасибо человеку. :) Не могли бы вы рассказать, что означает «default \ 11»? – baltoro

+0

Просто обновил ответ с объяснением :) – Stephan202

+0

Awesome. Любил «группу». Большое спасибо. :) – baltoro

1

Во-первых, вы можете использовать несколько линий, как это:

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 
+0

Спасибо Шеннон. Есть ли способ с awk посмотреть, есть ли его «1» перед «по умолчанию», а затем заменить его «0» или «0», а затем заменить на «1». Или я должен использовать инструкцию IF-ELSE. – baltoro

+0

Вот отредактируйте, чтобы сделать его переключателем 1-> 0 0-> 1. –

+0

Спасибо, Шеннон за то, что помог мне. – baltoro

1

Это заменяет 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]$/ использует решение, чтобы выбрать строки, которые содержат только "по умолчанию 0" или «по умолчанию 1» (или «по умолчанию 2» во второй форме) с любым ненулевым количеством пробелов и/или вкладок между «по умолчанию» и числом
  • s/0/1/ - sub ментируют «1» для «0»
  • t - филиал до конца, если замена была сделана, если нет, то по-прежнему с помощью следующей команды
  • с последующим дополнительной заменой (ами) (и филиалов)

Edit:

Вот еще один способ сделать это:

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

 Смежные вопросы

  • Нет связанных вопросов^_^