xargs з двома командами - mkdir і sed


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

Помилка отримана, оскільки ви використовуєте багато '. Зокрема s/$/\/version/ знаходиться поза жодною окремою цитатою.

sed або працює над файлом або на стандартному введенні. Він не може змінити рядок, переданий як параметр. printf Вбудовану команду можна використовувати для додавання /version.

Зауваження:

  • для кожного рядка, що читається з tmp1 файлу, тому імена не містять \n.
  • відповідно до використання cut і tr, отримані каталоги не будуть містити жодних . ні ; char в їх іменах.

Те, що ви намагаєтеся досягти, це:

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 (нуль) char.

xargs:

  • -0: Вхідні елементи завершуються нульовим символом, а не пробілами, а котирування    і зворотний слеш не є особливим (кожен символ береться буквально). Вимикає кінець    рядок файлу, який розглядається як будь-який інший аргумент. Корисно, коли вхідні елементи можуть бути    містити пробіл, лапки або зворотні косою рискою.

bash -c ...:

  • arg0dummy: не використовується, але є обов'язковим; подивитися man bash.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.