Как SED может заменить в диапазоне Nth Line Regex, указанного?

Конечно, можно сделать резервную копию и восстановить сделанные вами настройки, но как это сделать, зависит от того, какие настройки вы имеете в виду.

Вообще, я бы разделил настройки на две категории:

Пользовательские настройки

Это настройки, такие как упомянутый макет моих панелей, они специфичны для вашего пользователя и обычно должны храниться в /home/.

Если вы создадите резервную копию содержимого /home/, а затем восстановите ее при новой установке, все пользовательские настройки также будут восстановлены. Важно, чтобы версии программного обеспечения на новой системе были не старше версий программного обеспечения на старой системе, иначе они могут не понять ваши конфигурации из-за слишком нового формата.

Системные настройки

Эти настройки не являются специфическими для вашего пользователя, они относятся ко всей системе. Различные службы располагают свои настройки в разных местах, но большинство из них, придерживающихся стандартов LSB, должны находиться в каталоге /etc.

Может возникнуть проблема, если вы скопируете весь каталог /etc в новую систему, особенно если версии программного обеспечения на новой системе не точно такие же, как на старой.

Если вам нужно перенести некоторые системные настройки, лучше сначала найти точный файл, в котором они хранятся, и скопировать только этот файл, если версия программного обеспечения, использующего этот файл, не одинакова на обеих системах, я бы также рекомендовал проверить, не был ли изменен формат конфигурационного файла, и при необходимости перенести его.

Общие рекомендации

Чтобы избавить себя от лишних хлопот, я бы рекомендовал сначала установить на новой системе точно такую же версию программного обеспечения, как и на старой (только 64-битную), чтобы убедиться, что конфигурационные файлы по-прежнему совместимы. После этого можно обновить систему до последних версий. Таким образом, вы все еще выполняете все процедуры обновления конфигурационных файлов.

0
27.01.2019, 04:11
2 ответа

С ed префикс 3-го регистра -нечувствительной «копии» с «Нет -» будет:

ed -s file <<< $'/[Cc][Oo][Pp][Yy]/\n//\n//\ns//No-&/\nw\nq' > /dev/null

Команды:

  • /[Cc][Oo][Pp][Yy]/--поиск, в ручном случае -нечувствительный способ для "копировать:
  • //--повторить поиск дважды
  • s//No-&/--заменить последнее совпадение префиксом «Нет -»
  • w--записать файл изменений на диск
  • q--уволился

С помощью sed вы можете выполнить некоторую предварительную -работу, чтобы найти номер строки для изменения:

sed -i $(grep -in copy file |awk -F: 'NR==3 { print $1 }')'s/copy/No-&/i' input

Работаем слева направо,

  • -i--GNU sed в -поместите параметр редактирования
  • $(... )--найти номер строки 3-го совпадения "copy"
    • grep -in copy file--найдите слово «копия», регистр -нечувствительно в fileи сообщите номера строк совпадений
    • awk -F: 'NR==3 { print $1 }'--в строке 3 вывода grep, разбить строку на двоеточия и вывести столбец 1 (номер строки)
  • s/copy/No-&/i--заменить «копировать» на «Нет -копии», регистр -безразлично
1
28.01.2020, 02:41

Используя awk, подсчитайте, сколько строк содержит строку Copyright, и когда мы дойдем до третьей такой строки, выполните замену первого такого вхождения в этой строке:

awk '/Copyright/ && ++n == 3 { sub("Copyright", "No-&") } { print }' file

Использование &в замене означает использование любого совпавшего регулярного выражения. В этом случае будет вставлена ​​строка Copyright. Это (с использованием&)также работает, например. sed.

Состояние перед первым блоком,

/Copyright/ && ++n == 3

сопоставит строку Copyrightс текущей строкой. Если он совпадает, nбудет увеличен. Если увеличенное значение nравно 3, блок выполняется.

Тестирование:

$ cat file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C

(файл такой же, как у вас, но содержимое продублировано один раз)

$ awk '/Copyright/ && ++n == 3 { sub("Copyright", "No-&") } { print }' file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# No-Copyright (C) 2015-2016 C
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
0
28.01.2020, 02:41

Теги

Похожие вопросы