O erro foi gerado porque você está usando muitos ' . Em particular, s/$/\/version/ está fora de qualquer citação única.
sed está trabalhando em um arquivo na entrada padrão. Não é possível alterar uma string passada como parâmetro. O comando interno printf pode ser usado para anexar /version .
Observações:
- há um nome extraído para cada linha lida do arquivo
tmp1, portanto, os nomes não contêm\n. - de acordo com o uso de
cutetr, os diretórios resultantes não conterão.nor;char em seus nomes.
O que você está tentando alcançar é isso:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
Observe que caracteres especiais em nomes quebrarão a linha de comando acima: por exemplo, ' (aspas simples).
cut e tr podem ser substituídos por apenas um awk , que com xargs -0 pode ser usado para manipular com segurança os nomes (separados com caractere nulo).
Experimente esta versão segura:
awk -F\; '{gsub(/[.]/,"/",$1);printf("%scut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
",$1)}' tmp1 | xargs -0 bash -c 'for f; do mkdir -p "${f}";printf "%s/version\n" "${f}";done' arg0dummy > output
awk script:
-
-F\;define;como separador de campo, então$1é o primeiro campo (antes de;) -
gsubé usado para substituir.por/ -
printfé usado para imprimir o resultado e inserir um caractere final(null).xargs
-0 :
-
bash -c ...: Itens de entrada são terminados por um caractere nulo em vez de por espaços em branco, e as aspas e barra invertida não são especiais (cada caractere é interpretado literalmente). Desativa o final de string de arquivo, que é tratada como qualquer outro argumento. Útil quando os itens de entrada podem contém espaços em branco, marcas de cotação ou barras invertidas.
arg0dummy :
-
man bash: não é usado, mas é obrigatório; veja %code% .