1

Я хочу создать каталоги и в той же строке я хочу изменить путь и сохранить его в выходном файле, я не хочу повторять код, поэтому я попытался:

cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I %  bash -c 'mkdir -p %; sed 's/$/\/version/'% > output'

И у меня есть ошибка:

sed: -e expression #1, char 6: unknown option to `s'

Вы знаете, что я делаю не так?

1 ответ1

1

Ошибка сгенерирована, потому что вы используете много ' . В частности, 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .