tr
одновременно просматривает только один символ, поэтому она не работает, когда вам нужно проверить контекст.
Поскольку разделы разделены пустыми строками, режим абзацев awk
отлично подходит:
awk -vRS= '{gsub(/\n/, ""); print $0 "\n"}' myfile.txt
Установка RS
пустыми загружает «записи», разделенные пустыми строками, и для каждого record мы снова удаляем символы новой строки, а затем печатаем запись с дополнительной новой строкой.
То же самое и в Perl, но с двумя дополнительными символами новой строки здесь, потому что Perl действительно загружает последний символ новой строки, как любой другой символ:
perl -00ne 's/\n//g; print "$_\n\n"' myfile.txt
Оба они будут обрабатывать несколько пустых строк так же, как одну.
Мы могли бы сделать это с помощью sed, но это немного сложнее, чем моя первоначальная попытка, если нам нужно поддерживать блоки из более чем двух строк.
sed -n 'H; $bL; /./d; :L; x; s/\n//g; s/$/\n/; p;' myfile.txt
Добавить текущую строку в буфер хранения ( H
), затем проверить, является ли это последней строкой ( $
), и в этом случае перейти к L ( bL
). Если нет, проверьте, есть ли какие-либо символы ( /./
), и если да, удалите ( d
) строку и вернитесь к началу.
В противном случае (строка пуста) перейдите к L
, где мы меняем местами ( x
) буфер удержания и текущую строку (пространство шаблона), удаляем новые строки ( s / \ n // g
), добавьте еще один в конец ( s / $ / \ n /
) и неявно распечатайте пространство шаблонов, теперь содержащее строки, которые мы собрали с предыдущего пустая строка. Здесь дополнительные пустые строки приведут к появлению дополнительных пустых строк.
Оболочка расширяет подстановочные знаки в аргументах, поэтому большинству приложений не нужно выполнять подстановочные знаки. Однако список исключений tar действительно поддерживает подстановочные знаки, которые совпадают с подстановочными знаками, поддерживаемыми традиционными оболочками. Помните, что могут быть небольшие различия; например tar не различает *
и **
, как ksh, bash и zsh. С tar *
может соответствовать любому символу, включая /
, поэтому, например, * /. Svn
исключает файл с именем .svn
в любом уровень иерархии. Вы можете использовать tar --no-wildcards-match-slash
, и в этом случае *
не соответствует разделителям каталогов.
Например, исключая /home/me/websites/*log.txt
, исключает /home/me/websites/log.txt
, / home / me / веб-сайты / foo-log.txt
и /home/me/websites/subdir/log.txt
. Исключая / home / me / sites / ** / vendor
, исключаются / home / me / sites / one / vendor
и / home / me / sites / one / two / vendor
, но не / home / me / sites / vendor
. С параметром - no-wildcards-match-slash
/home/me/websites/*log.txt
не исключает / home / me / sites / subdir /бревно.txt
и / home / me / sites / ** / vendor
не исключает / home / me / sites / one / two / vendor
.
tar… --exclude = '/ home / www-data / sites / * include'…
исключает файлы и каталоги в / home / www-data / sites
, имя которых заканчивается на включают
. Вы можете обойтись без кавычек, но только не, если вы напишете (потому что тогда оболочка расширит подстановочные знаки перед - exclude / home / www-data / sites / * include
tar
могут их видеть) или если вы используете оболочку, которая сигнализирует об ошибке при несовпадении подстановочных знаков (например, zsh в конфигурации по умолчанию - и рекомендованной - конфигурации).
Для параметра - exclude-from
требуется имя файла. Файл должен содержать по одному шаблону в строке. Не путайте - исключить
(за которым следует шаблон) и - исключить из
(за которым следует имя файла, содержащего шаблоны).