Как читать, часть иглы sed управляют из файла?

Попробуйте следующую строку

find /path/to/files -mtime +7 -size +1M
3
13.04.2017, 15:36
2 ответа

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

Следует отметить, что все указанные выше значения по умолчанию являются разумными. Здесь нет никаких ошибок.

В вашем случае вы устанавливаете файлы на /usr/local как часть вашего двоичного пакета Debian, что является нарушением Стандарта Иерархии Файлов и является неправильным . Не делай этого. Пользовательские двоичные файлы должны входить в /usr/bin , например, библиотеки должны входить в /usr/lib и т.д. Предполагается, что пакет создает /usr/local/bin , поскольку dpkg , естественно, уже не знает об этом. (Так как пакет Debian, содержащий файлы/каталоги в /usr/local , является нарушением политики FHS и, следовательно, политики Debian). Поэтому он пытается удалить этот файл при удалении пакета. Прекратите установку в /usr/local , и проблема исчезнет.

Дать нам немного больше контекста, возможно? Почему вы пытаетесь построить свой собственный пакет zsh Debian, а не использовать дистрибутив, и какой дистрибутив вы используете в любом случае?

Если вы действительно хотите сделать это, вот простой наконечник. Проверьте, как ваш дистрибутив (или даже Debian) пакеты zsh, и просто повторно использовать пакет. Это должно сработать нормально. Нет причин пытаться писать свои собственные, если только вы не пытаетесь научиться упаковывать, что, я полагаю, здесь не так.

-121--70060-

Можно запустить yum erase elfutils-libelf в зависимые пакеты, которые необходимо удалить, чтобы удалить elfutils-libelf.

-121--186819-

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

sed -e "s/$(cat needle.txt)/replace/" subject.txt

Обратите внимание на использование двойных кавычек.

Это сделает sed интерпретировать любые метасимволы regex из needle.txt как метасимволы regex, а не обычные символы. Если needle.txt содержит /, он будет прерван.

Если требуется, чтобы строки needle.txt интерпретировались буквально (даже если они содержат метасимволы regex, как в вашем примере), можно сделать что-то вроде:

perl -pe '
    BEGIN{ local $/; 
           open $IN,"<","needle.txt";
           $needle = <$IN>
    }
    s/\Q$needle/replace/
'  subject.txt

Объяснение

  • Переключатели -pe означают применение кода, следующего за строкой, к строкам файла subsuect.txt и печать каждой строки после завершения обработки.
  • Сегмент BEGIN {} выполняется только один раз. Он открывает файл needle.txt и сохраняет все его содержимое в переменной $ eigle .
  • s/\Q $ eigle/replace/ - это тот же синтаксис, который вы ожидали от sed , за исключением того, что \Q заставляет регексный движок Perl рассматривать всё после него как фиксированный ряд, а не как регекс.
4
27.01.2020, 21:16

sed очень специфичен для r ead - он будет делать это только для строки, которая соответствует его шаблону - и всегда будет делать это последней . sed не будет r извлечь файл для соответствующего шаблона, если шаблон перестает соответствовать до того, как он очистит строку. По крайней мере, я думаю, что это работает - я неплохо разбираюсь в sed , но r иногда все еще сбивает меня с толку.

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

Вы можете сделать это относительно легко с помощью N; P; D - который будет работать согласованно, чтобы продвинуть счетчик строк sed как минимум на одну строку впереди печатаемых строк. Рассмотрим следующие два файла:

###file1
some string 1
some string 2
some other string
some string 4
some string 5

###file2
some other file

Теперь моя цель - выполнить подстановку, заменяя шаблон, от которого зависит r ead, и , чтобы получить r ead для распечатайте его содержимое до того, как мое изменение будет напечатано. Вот как я это делаю:

sed '$!N;s/other \(.*\)\(\n\)/\1 3\2/
     /\n.*other/r file2
     P;D' file1

OUTPUT

some string 1
some string 2
some other file
some string 3
some string 4
some string 5

Я также проделал то же самое с другим файлом2, который напечатал ...

some string 1
some string 2
no trailing newline some string 3
some string 4
some string 5

У меня есть некоторые довольно серьезные сомнения относительно переносимости такого поведения, но это было с GNU sed , чего стоит.

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

Шаблон, который соответствует r ead, соответствует только тогда, когда символ \ n ewline встречается перед , которому он соответствует для цикла, когда sed сначала втягивает его с помощью N - он соответствует только циклу, в котором мы его не видим.

Замена происходит только тогда, когда \ n ewline встречается после шаблона - это цикл, в котором он будет P ритирован, в конце концов, но sed очищает свой буфер строки и увеличивает строку, когда мы извлекаем строку N ext, поэтому затем печатается r , а затем , затем ] происходит замена. Это действительно утомительно, но я тоже.

И, говоря о GNU sed , он действительно предлагает довольно интересный вариант для подобных ситуаций.

sed '/other/{x;s/.*/cat file2/e;G
     s/\(.*\)\n\(.* \)other \(.*\)/\1 \2\3 3/
}' file 

info sed сообщит вам ...

  • e [COMMAND] Эта команда позволяет направлять ввод от команды оболочки по конвейеру в пространство шаблонов .Без параметров команда `e 'выполняет команду , которая находится в пространстве шаблонов, и заменяет пространство шаблона выводом; завершающий символ новой строки подавляется.

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

Кстати, выше напечатано:

some string 1
some string 2
some other file some string 3
some string 4
some string 5
1
27.01.2020, 21:16

Теги

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