Замените строку, содержащую символы новой строки

Мое предложение на этом было, сделайте резервное копирование целой корневой фс (включая/usr/local), затем повторное разделение, смонтируйте весь раздел и извлеките все.

После этого все Ваши файлы стояли бы, и Ваш диск был повторно разделен.

При простом резервном копировании/usr/local существует риск, что, после того как системные библиотеки обновляются, те, которые программному обеспечению (нестатические), возможно, понадобилось бы пересоединение.

10
13.04.2017, 15:36
4 ответа

$ HOME/.vnc/xstartup предназначен для рабочего стола X, работающего на сервере, а не для самого сервера. Необходимо создать файл $ HOME/.vncrc с именем

$geometry = "1400x850";

. У вас есть некоторая документация в:

/usr/share/doc/vnc4server/examples/vnc.conf.gz
-121--102930-

«команда rpm просто добавляет vlc rpm к yum repo»...

Закрыть. Я думаю, что пакет, установленный с помощью rpm , добавляет репозиторий RPM Fusion , после чего yum может устанавливать пакеты из этого репозитория. Очевидно, что первый пакет не может быть установлен через yum , так как он отсутствует в репозиториях, настроенных для yum . Поэтому его нужно было вручную загрузить и установить.

vlc доступен в репозитории RPM Fusion (но не в официальных репозитариях для Fedora, я полагаю), поэтому, если вы не добавите этот репозиторий, yum list не будет показывать ничего для vlc .

-121--210053-

Три различные команды sed :

sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'

sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'

sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'

Все три команды строятся на основе базовой команды s/// ubstitation:

s/"[^"]*"\n<[^>]*>/other characters /

Все они также стараются позаботиться о своей работе с последней строкой, так как sed имеют тенденцию отличаться на выходе в краевых случаях. Это значение $! , который является адресом, соответствующим каждой строке, которая является ! не последний $ .

Все они также используют команду N ext для добавления следующей входной строки в пространство шаблона после символа \n ewline. Любой, кто был sed inging в течение некоторого времени научится полагаться на символ \n ewline - потому что единственный способ получить его - явно поместить его туда.

Все трое пытаются прочесть как можно меньше входных данных перед выполнением действия - sed действует, как только он может и не должен читать во всем входном файле, прежде чем сделать это.

Хотя они делают все N , все они отличаются по методам рекурсии.

Первая команда

Первая команда использует очень простой цикл N; P; D . Эти три команды встроены в любой POSIX-совместимый sed и отлично дополняют друг друга.

  • N - как уже упоминалось, добавляет N ext входную строку к пространству шаблона после вставленного \n разделителя ewline.
  • P - подобный p ; он P печатает шаблон-пробел - но только до первого встречающегося символа \n ewline. Поэтому, учитывая следующие входные данные/команды:

    • printf% s\\n one two | sed '$! N; P; d'
  • sed P печатает только one . Однако с...

  • D - подобный d ; он D удаляет узор-пространство и начинает другой линейный цикл. В отличие от d , D удаляет только до первого появления \n ewline в образец -пространство. Если после символа \n ewline в поле pattern-space больше, sed начинает следующий цикл строки с оставшимся. Если d в предыдущем примере были заменены на D , например, sed будет P печатать как один , так и два .

Эта команда рекурсивна только для строк, которые не соответствуют инструкции s/// ubstitution. Поскольку функция s/// удаляет \n ewline, добавленную с помощью N , ничего не остается, когда sed D удаляет узор-пространство.

Тесты могут быть выполнены для выборочного применения P и/или D , но есть другие команды, которые лучше соответствуют этой стратегии. Поскольку рекурсия реализуется для обработки последовательных строк, которые соответствуют только части правила замены, последовательные последовательности строк, соответствующих обоим концам s/// ubsitation, работают плохо.:

Учитывая этот ввод:

first "line"
<second>"line"
<second>"line"
<second>line and so on

... он печатает...

first other characters "line"
<second>other characters line and so on

Однако он справляется с

first "line"
second "line"
<second>line

... просто прекрасно.

Вторая команда

Эта команда очень похожа на третью. Оба используют : b ranch/ t est label (как также показано в ответе Joeseph R. здесь ) и возвращают его к определенным условиям.

  • -e: n -e - переносимые sed скрипты будут разделять определение метки : либо \n ewline, либо новой встроенной -e инструкцией execution.
    • : n - определяет метку с именем n . Его можно вернуть в любое время с помощью bn или tn .
  • tn - команда t est возвращается к указанной метке (или, если отсутствует, выходит из сценария текущего цикла строки) , если какая-либо s/// ubsitation с момента определения метки или с момента последнего вызова t ests успешно выполнена.

В этой команде происходит рекурсия для соответствующих строк. Если sed успешно заменяет образец другими символами , sed возвращается к метке : n и пытается повторить попытку. Если функция s/// не выполняется sed autoprints pattern-space и начинается следующий цикл строки.

Это имеет тенденцию обрабатывать последовательные последовательности лучше. Если последняя не удалась, это приводит к печати:

first other characters other characters other characters line and so on

Третья команда

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

  • /" $/bn - это тест sed . Поскольку команда b ranch является функцией этого адреса, команда sed возвращает только b ranch к :n после добавления \n ewline, и пробел шаблона по-прежнему заканчивается двойной кавычкой ".

Между N и b сделано как можно меньше - в этом пути sed может очень быстро собрать ровно столько входных данных, сколько необходимо, чтобы убедиться, что следующая строка не может соответствовать вашему правилу. Функция s/// отличается здесь тем, что в ней используется флаг g lobal - и поэтому она будет выполнять все необходимые замены одновременно. При идентичном вводе эта команда выводится идентично последней.

3
27.01.2020, 20:00

Вот вариант ответа glenn, который будет работать, если у вас несколько последовательных вхождений (работает только с GNU sed):

sed ':x /"line"/N;s/"line"\n<second>/other characters/;/"line"/bx' your_file

:x - это просто метка для ветвления. В основном, это проверяет строку после замены, и если она всё ещё совпадает с "строкой", то она ответвляется обратно на метку :x (это то, что делает bx) и добавляет в буфер ещё одну строку и начинает её обрабатывать.

3
27.01.2020, 20:00

Прочитайте весь файл и сделать глобальную замену:

sed -n 'H; ${x; s/"line"\n<second>/other characters /g; p}' <<END
first "line"
<second> line followed by "line"
<second> and last
END
first other characters  line followed by other characters  and last
6
27.01.2020, 20:00

Ну, я могу придумать пару простых способов, но ни один из них не включает в себя grep (который все равно не делает замен) или sed.

  1. Perl

    Для замены каждого появления "строки"\n<секунда> на другие символы, используйте:

    $ perl -00pe 's/"строка"\n<секунда>/другие символы /g' файла.
    первая строка из других символов и так далее
    

    Или, чтобы обработать несколько последовательных вхождений "строки"\n<секунда> как одно и заменить их все одним другим символом, используйте:

    perl -00pe 's/(?: "строка"\n<секунда>)+/другими символами /g' файла.
    

    Пример:

    $ кошачий файл
    первая "строчка"
    <секунда>"линия"
    <секунда>"линия"
    <второй> строчкой и так далее
    $ perl -00pe 's/(?: "строка"\n<секунда>)+/другие символы /g' файл.
    первая строка из других символов и так далее
    

    -00 заставляет Perl читать файл в "абзацевом режиме", что означает, что "строки" определяются с помощью \n\n, а не с помощью \n, по сути, каждый абзац рассматривается как строка. Таким образом, подстановка соответствует новой строке.

  2. awk

    $ awk -v RS="\n\n" -v ORS=" '{
     sub(/"строка" \n<секунда>/, "другие символы", $0)
     Печать;
     файл 
    первая строка из других символов и так далее
    

    Та же самая основная идея, мы установили разделитель записей (RS) на \n\n, чтобы стереть весь файл, затем разделитель выходных записей ни на что (в противном случае будет напечатана дополнительная новая строка), а затем использовали функцию sub(), чтобы сделать замену.

7
27.01.2020, 20:00

Теги

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