tar «--exclude-from» с двойным символом звезды

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 / ) и неявно распечатайте пространство шаблонов, теперь содержащее строки, которые мы собрали с предыдущего пустая строка. Здесь дополнительные пустые строки приведут к появлению дополнительных пустых строк.

2
02.01.2016, 16:27
1 ответ

Оболочка расширяет подстановочные знаки в аргументах, поэтому большинству приложений не нужно выполнять подстановочные знаки. Однако список исключений 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 требуется имя файла. Файл должен содержать по одному шаблону в строке. Не путайте - исключить (за которым следует шаблон) и - исключить из (за которым следует имя файла, содержащего шаблоны).

8
27.01.2020, 21:51

Теги

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