Вот мое предложение по использованию временного файла:
tmpdir=$(mktemp)
find "Image Folder" -print0 > $tmpdir/temp
{ grep -z collage $tempdir/temp | sort -z;
grep -z -v collage $tempdir/tmp | sort -z; } | \
tar cv --no-recursion --null -T -
rm -rf $tmpdir
Вы можете использовать что-то более простое для временного файла, при условии, что вы не помещаете его в "Image Folder".
Основная идея этого решения - сохранить результаты find
во временный файл, чтобы мы могли запустить два grep
а, сортируя каждый результат grep
по отдельности, прежде чем объединить их в трубу для tar
.
Вы не должны избегать>
(\>
это специальное слово -граница шаблон ).
У меня это работает (с использованием GNUsed
):
sed -e 's/>/\n>/g' file1
В вашем случае вывод, который я получаю,:
>XXX[YY]
ZZZZZZ
>XXX[YY]
ZZZZZZ
>XXX[YY]
ZZZZZZ
\>
— это специальный шаблон, который будет соответствовать пробелу нулевой ширины -между словом и не -символом слова. >
ни в каком смысле не является особенным, поэтому его не нужно экранировать.
Чтобы добавить новую строку перед каждым >
в каждой строке, кроме первой, используя стандартный sed
, вы можете сделать
$ sed '2,${ y/>/\n/;s/\n/&>/g; }' file
>XXX[YY]
ZZZZZZ
>XXX[YY]
ZZZZZZ
>XXX[YY]
ZZZZZZ
Стандарт sed
не может вставить новую строку с помощью s/>/\n>/g
, поэтому мы должны сделать это в два этапа.
2,$
обращается ко всем строкам ввода, кроме начальной строки. К этим строкам будут применены команды из {... }
.
Команда y/>/\n/
заменяет все экземпляры символа >
новой строкой. Команда y
может вставлять новые строки в стандартный sed
.
s/\n/&>/g
заменяет каждую сгенерированную новую строку совпадающей новой строкой, за которой следует >
. Когда &
встречается в замещающей части команды s
, она вставляет все, что соответствует шаблону.
Я попытался использовать описанный ниже метод, и он работал нормально
команда:sed "/^[^>]/s/>.*/\n&/g" filename
выход
sed "/^[^>]/s/>.*/\n&/g" filename
>XXX[YY]
ZZZZZZ
>XXX[YY]
ZZZZZZ
>XXX[YY]
ZZZZZZ