Замените шаблон, который заканчивается в новой строке тем же шаблоном без новой строки

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

Это обладало бы дополнительным преимуществом, которое Вы могли "восстановить" несколько настроек сразу, например, чат (гибридный язык, irssi), просмотрев (хром).

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

1
31.10.2013, 00:32
2 ответа

Мобильность? Обработка текста? Perl, конечно:

perl -n0777e 's{\n+}{\n}g' your_file

где -0777 дает Perl команду читать целый файл в сразу так, чтобы последовательные новые строки могли быть найдены Perl.

Вышеупомянутое удалило бы все дублирующиеся новые строки. Удалить только тех, которые после [FACT], можно сделать:

perl -n0777e 's{\[FACT\]\n+}{\n}g' your_file
3
27.01.2020, 23:29
  • 1
    Для увеличения примера @Joseph можно использовать следующую остроту для изменения файла на месте при создании резервной копии (.orig расширение): perl -pi'.orig' -n0777e 's{(.*FACT)\n+}{\1\n}g' /tmp/file –  troydj 31.10.2013, 02:11
  • 2
    @troydj Вам нужно ...{$1\n}g вместо ...{\1\n}g. Использование Perl \1 как обратная ссылка только на "левой стороне" замены. "Правая сторона" должна содержать нормальные переменные Perl (следовательно $1).как есть \1 на правой стороне будет ссылка на анонимное скалярное, содержащее 1. –  Joseph R. 31.10.2013, 23:11

Я предполагаю, что "две новых строки" означают \n\n а не две пустых строки после строки с [FACT] (который был бы тремя новыми строками). Так или иначе sed будет работать, поскольку он разделяет только первую новую строку после [FACT].

$ echo -e '[FACT]\n\nend'
[FACT]

end

Это будет искать строки, заканчивающиеся в [FACT] и для каждой строки, которая соответствует, мы используем N добавлять следующую строку в текущее пространство шаблона, сохраняющее новую строку, которую sed обычно разделяет из пространства шаблона.

$ echo -e '[FACT]\n\nend' |sed '/\[FACT\]$/ { N; s/\n// }'
[FACT]
end

Если [FACT] не должен конкретно быть в конце строки, удалить $ от команды.

Обратите внимание на то, что это технически разделяет новую строку от конца строки, которая содержит [FACT] таким образом, это технически связывает две строки в одну:

$ echo -e '[FACT]\nhelp\nend' 
[FACT]
help
end

$ echo -e '[FACT]\nhelp\nend' |sed '/\[FACT\]$/ { N; s/\n// }'
[FACT]help
end
0
27.01.2020, 23:29

Теги

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