Argumento de Argumento Bash Regex Conflito de Grupo

2

Eu tenho um script simples:


input_dir="'dirname $1'/'basename $1'/"
output_dir="'dirname $2'/'basename $2'/"
ext=$3
...
...
...
echo -n 'rename "-f" "'s/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/'" "$output_dir"*.$ext'

O problema é que ele não funciona porque os grupos de correspondência $N estão em conflito com os argumentos da linha de comandos para o script. Como posso resolver isso?

    
por Petr 21.08.2011 / 12:34

2 respostas

1

Em geral, você pode impedir que o shell interprete um metacaractere escapando com uma barra invertida ( \ ). Então, você pode evitar todos o $ no argumento rename é expandido com a preposição de um barra invertida:

echo -n 'rename "-f" "'s/.*([0-9]{11}_[0-9]{11}).*\.(.*\$)/\.\/'" "$output_dir"*.$ext'

Neste caso específico, uma vez que a string s/.*([0-9]...$2/ não precisa de qualquer substituição no nível do shell (o ponto principal da sua pergunta é como evitá-los), você pode simplesmente colocá-lo entre aspas simples ( ' ) que impede todo o processamento de shell:

echo -n 'rename "-f" 's/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/' "$output_dir"*.$ext'

(Note que você não precisa de aspas em torno do -f , já que ele não contém quaisquer metacaracteres de shell.)

    
por 21.08.2011 / 12:53
1

Com relação à pergunta que você fez: use aspas simples ao redor de uma string literal onde você não quer que nenhuma substituição aconteça. Se você precisar de uma única citação nessa sequência, digite-a como '\'' .

echo -n 'rename "-f" 's/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/' "$output_dir"*.$ext'

Há algo mais errado com seu código. O resultado de uma variável substituta como $1 e $2 ou uma substituição de comando como 'rename …' é analisada pelo shell, ele executa a divisão de palavras e a globulação no resultado. Sempre use aspas duplas em torno de substituições de variáveis e substituições de comandos , a menos que você saiba que precisa omiti-las. Além disso, não use backquotes, pois eles manipulam citações aninhadas de maneiras complicadas e dependentes de shell. Todos os shells fora dos museus suportam a sintaxe saner $(…) . Além disso, você precisa de um -- nas invocações de dirname e basename , no caso de $1 ou $2 começar com - e, assim, parecer uma opção.

input_dir="$(dirname -- "$1")/$(basename -- "$1")/"
output_dir="$(dirname -- "$2")/$(basename -- "$2"/)"
ext="$3"    # here it would be ok to omit the quotes, but if you're unsure of the rules, put the quotes in
echo -n "$(rename -f 's/.*([0-9]{11}_[0-9]{11}).*\.(.*)$/$1.$2/' "$output_dir"*".$ext")"

Como um aparte, não entendo o que você está tentando alcançar aqui. Do jeito que você está invocando, rename não produz saída.

    
por 21.08.2011 / 16:49

Tags