insere uma string entre dois padrões

1

Eu gostaria de alterar o arquivo com o nome como:

d1-a2_A1_B1.txt
abcd_A90_B2.txt

em que quero inserir _FOO entre os primeiros _A[0-9]\+ e _B[0-9] , para que os nomes dos arquivos se tornem

d1-a2_A1_FOO_B1.txt
abcd_A90_FOO_B2.txt

Mas minha expressão regular não funciona:

for f in $(ls); do mv $f \'echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\'; done

Eu tentei com uma única string:

echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/

OK: isso funcionou:

echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/_FOO/'
    
por user2783615 14.11.2015 / 05:50

2 respostas

0

  • Adicione a opção -r a sed (para conseguir usar expressões regulares estendidas; normalmente não entende + ).
  • Coloque seu script sed entre aspas (preferencialmente aspas simples).
  • Altere $1 e $2 no seu script para e :

    sed -re 's/(._A[0-9]+)(_B[0-9].)/_FOO/'

Além disso,

  • Para maior clareza, talvez você queira alterar '…' para $(…) - veja este , este , e isto - ou seja, manipule o echo | sed da mesma maneira que você manipula o ls .
  • É melhor dizer for f in * (em vez de for f in $(ls) ).
  • Você deve citar referências de variáveis do shell (por exemplo, echo "$f" ) a menos que você tenha uma boa razão para não e você tem certeza que sabe o que está fazendo.
por 14.11.2015 / 06:01
0

Você pode evitar o uso de sed e outras manipulações de strings usando mmv :

$ mmv -m -n  '*_A*_B*.txt' '#1_A#2_FOO_B#3.txt'
abcd_A90_B2.txt -> abcd_A90_FOO_B2.txt
d1-a2_A1_B1.txt -> d1-a2_A1_FOO_B1.txt

(Deixe de fora o -n ou substitua-o por -v para realmente renomear os arquivos depois de confirmar que todos os arquivos foram correspondidos e renomeados como você deseja.

    
por 19.11.2015 / 00:30