Ошибка сгенерирована, потому что вы используете много '
. В частности, s/$/\/version/
находится за пределами одной кавычки.
sed
либо работает с файлом, либо со стандартным вводом. Он не может изменить строку, переданную в качестве параметра. Встроенная команда printf
может использоваться для добавления /version
.
Примечания:
- для каждой строки, прочитанной из файла
tmp1
, извлекается одно имя, поэтому имена не содержат \n
.
- в соответствии с использованием
cut
и tr
, результирующие каталоги не будут содержать никаких .
ни ;
символ в их именах.
То, что вы пытаетесь достичь, это:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
Обратите внимание, что специальные символы в именах нарушают вышеприведенную командную строку: например, '
(одинарная кавычка).
cut
и tr
могут быть заменены только одним awk
который с xargs -0
может использоваться для безопасной обработки имен (разделенных нулевым символом).
Попробуйте эту безопасную версию:
awk -F\; '{gsub(/[.]/,"/",$1);printf("%s\0",$1)}' tmp1 | xargs -0 bash -c 'for f; do mkdir -p "${f}";printf "%s/version\n" "${f}";done' arg0dummy > output
сценарий awk
:
-F\;
определяет ;
как разделитель полей, $1
является первым полем (перед ;
)
gsub
используется для замены .
с /
printf
используется для печати результата и вставки окончательного символа \0
(null).
xargs
:
-0
: входные элементы заканчиваются нулевым символом, а не пробелом, и кавычки и обратный слеш не являются специальными (каждый символ воспринимается буквально). Отключает конец строки файла, который обрабатывается как любой другой аргумент. Полезно, когда элементы ввода могут содержать пробелы, кавычки или обратную косую черту.
bash -c ...
:
arg0dummy
: не используется, но является обязательным; увидеть man bash
.