Referencia dinamicamente o nome de um arquivo

1

Em um único diretório, gostaria de substituir a primeira linha de cada arquivo pelo nome do arquivo. Cada arquivo tem como primeira linha "TestRelation". Eu gostaria de substituí-lo com o nome do arquivo.

Eu sei que posso usar perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt para percorrer todos os arquivos. Mas como eu mudo dinamicamente o "REPLACE_WITH" com o nome do arquivo?

    
por Adam_G 08.02.2015 / 16:36

4 respostas

1

Tente:

perl -i.bak -wpe 's/SEARCH_FOR/$ARGV/g' *.txt

$ ARGV contém o nome do arquivo atual ao ler <> .

Como você usa a opção -i , não precisa se preocupar com implicação de segurança ao executar perl com -n ou -p switch.

    
por 08.02.2015 / 16:51
1

Um script de shell com um "documento aqui" lidará com isso muito bem:

#!/bin/bash
for NAME in t?
do
ex -s $NAME << END_EDITS
1s/TestRelation/$NAME/
w!
q
END_EDITS
done

Não sabendo o nome dos seus arquivos, escolhi "t1", "t2", "t3", etc. como nomes de arquivos. Você terá que gerar nomes de arquivo conforme apropriado.

O loop "for" fornece à variável de shell NAME o valor do nome de um arquivo a cada vez através do loop. A instância bash executando o script acima chama o editor ex em cada nome de arquivo e fornece algumas linhas de entrada. O comando 1s/TestRelation/$NAME/ ex é expandido pela instância bash , que substitui o nome de um arquivo pela parte "$ NAME".

Você precisa ter o token que termina o "aqui documento" ( END_EDITS neste caso) no início de uma linha, sem espaço em branco na frente.

    
por 08.02.2015 / 16:46
0

Você pode tentar algo assim.

for i in 'ls *.sh'; do echo "$i">>$i.new; cat $i.new $i >>$i.new;done

O que isto basicamente lista os arquivos e armazena os nomes dos arquivos. Escreva esses nomes em um novo arquivo e coloque-o no arquivo original. Você também pode mover o arquivo .new para o nome do arquivo original, se necessário. Esta não é a opção mais elegante, mas funciona.

    
por 08.02.2015 / 16:50
0

Se você quiser fazer isso no shell, use o comando find para listar arquivos e, em seguida, o comando basename para obter o nome do arquivo e use sed para substituir a string

for i  in $(find . -type f); do fname=$(basename $i); sed -i "s/TestRelation/${fname}/" $fname; done

Bem, basename e find não são necessários e você pode usar apenas ls se tiver certeza de apenas arquivos em uma determinada pasta que está pesquisando

    
por 08.02.2015 / 16:42