Localizar e substituir por nome de arquivo

0

Eu tenho um grande número de arquivos que contêm texto. Todos os arquivos contêm a palavra "substituir" (sem aspas). Eu gostaria de substituir essa palavra com o nome do arquivo.

Exemplo, filename é: On Time.txt

Substitua a palavra "replace" (sem as aspas) por "On Time" (sem as aspas).

    
por Phydeaux 15.03.2016 / 22:39

3 respostas

0
for filename in "On time.txt" ; do
  replacement=$(echo $filename | sed -e 's,^.*/,,' -e 's,\.[^\.]*$,,')
  [ -f "$filename" ] && sed -i "s,replace,$replacement," "$filename"
done

Para fazer todos os arquivos em seu diretório, substitua "On time.txt" por * assim:

for filename in * ; do

Note que aqui os nomes dos arquivos não podem conter vírgulas (você pode escolher o caractere para que ele não apareça nos seus nomes de arquivo).

    
por 15.03.2016 / 22:49
0

Eu usaria sed para isso:

for f in *.txt
do
    fullfile="$f"

    # filename without path (on_time.txt)
    filename=$(basename "$fullfile")

    # remove extension of filename (on_time)
    filename_woext="${filename%.*}"

    # replace all occurrences of "replace" with "on_time" in file
    sed -i -e "s/replace/$filename_woext/g" $filename

done
    
por 15.03.2016 / 22:43
0
find . -name "*" -type f | xargs sed -i -e "s/replace/On\ Time/g"

Isso substituirá "todos" os arquivos de texto nos diretórios atuais (e subdiretórios) que você desejar.

Se você quiser apenas no diretório atual e não em seus subdiretórios.

find . -name "*" -type f -maxdepth 1 | xargs sed -i -e "s/replace/On\ Time/g"

Se você deseja substituir em um diretório diferente do seu diretório atual.

find /path/do/dir -name "*" -type f | xargs sed -i -e "s/replace/On\ Time/g"

Funciona para mim no shell zsh. Deve trabalhar em tudo o mais também.

    
por 15.03.2016 / 23:38

Tags