Использование только sed (с флагом -r
для расширенного регулярного выражения)
echo "aaa string1 bbb aaa string2 bbb aaa string3 bbb" | sed -r 's/(aaa|bbb) ?//g'
Возвращает
string1 string2 string3
У вас также есть эта версия с использованием tr и grep (с -vE
):
echo "aaa string1 bbb aaa string2 bbb aaa string3 bbb" | tr ' ' '\n'| grep -vE '(aaa|bbb|^$)'
Возвращает
string1
string2
string3
tr
просто заменяет пробел на новую строку.
grep -vE
использует регулярное выражение («E») и исключает совпадающие строки («v»).
Третья версия использует sed (без флага) и grep (так же, как и в предыдущей версии):
echo "aaa string1 bbb aaa string2 bbb aaa string3 bbb" | sed 's/\s/\n/g' | grep -vE '(aaa|bbb|^$)'
Делает почти то же самое, что и вторая версия, используя sed вместо tr.
Редактировать: Также добавлен ^ $
в строку поиска grep, чтобы убедиться, что она не возвращает нежелательные символы новой строки.
Edit2: Я вижу, вы изменили OP. Выше ответ на исходный вопрос. Ниже я написал сценарий, который может вам помочь: http: // pastebin.com / uKWAGE0Y
cpio
имеет опцию -E
(--pattern-file
), которая позволяет читать список имен файлов из файла вместо (или одновременно с) предоставления имен файлов в командной строке. Например:
cpio -icuBdmv -E files-to-extract < preserved.cpio
cpio
также имеет опцию -F
для указания имени архива (вместо использования stdin/stdout). -I
и -O
похожи, но работают вместо stdin или stdout соответственно.
Например, вы можете указать архив с помощью -F
и предоставить список файлов на stdin:
cpio -icuBdmv -F preserved.cpio < files-to-extract
или использовать и -E
и -F
cpio -icuBdmv -E files-to-extract -F preserved.cpio
BTW, для многих программ GNU (включая cpio
, man-страницы почти бесполезны, но они хорошо документированы в .info файлах. В некоторых дистрибутивах Linux информационные документы часто являются отдельными пакетами (например. в debian, cpio-doc
), поэтому вам потребуется установить их, а также программу для чтения информации (например, GNU info
или pinfo
)
в любом случае, вот некоторые подходящие выдержки из информационных страниц cpio
:
-E FILE
,--pattern-file=FILE
Чтение дополнительных шаблонов, указывающих имена файлов для извлечения или перечисления из FILE. Строки FILE обрабатываются так, как если бы они были аргументами cpio без опций. Эта опция используется в режиме копирования,
и
-F ARCHIVE
,--file=ARCHIVE
Имя архивного файла для использования вместо стандартного ввода или вывода. Чтобы использовать ленточный накопитель на другой машине в качестве архива, используйте имя файла, начинающееся с
HOSTNAME:
, где HOSTNAME - имя или IP-адрес машины. Имени хоста может предшествовать имя пользователя и@
для доступа к удаленному ленточному накопителю от имени этого пользователя, если у вас есть на это разрешение (обычно запись в файле~/.rhosts
этого пользователя).
Пробелы в именах файлов могут быть непростыми, но я думаю, что это может помочь.
Вместо cat
в файлах для извлечения попробуйте пропустить их через xargs
, заменив символ NULL на EOL.
Что-то вроде
tr '\n' '\0' < list-of-files | xargs -0 -I{} sh -c 'cpio -icuBdmv "{}" < preserved.cpio'
должно помочь.