Usando sed em arquivos com certa extensão dentro do shell script

0

Estou tentando usar o sed para encontrar arquivos com determinada extensão e, em seguida, substituir ocorrências de uma determinada string por outra.

No directory mentioned using current directory
*.h
sed: can't read *.h: No such file or directory
*.C
sed: can't read *.C: No such file or directory
*.cc
sed: can't read *.cc: No such file or directory
un.cpp

Este é o código no meu script:

for file in *.{h,C,cc,cpp}
       do
          echo $file;
          sed -i -e 's/${1}/${2}/g' $file;
       done

Estou tendo um problema semelhante ao tentar usar o sed em subpastas recursivamente usando o find:

find ./*.{h,C,cc,cpp} -type f -exec sed -i -e 's/${2}/${3}/g' {} \;

Obrigado

    
por KLMM 20.01.2016 / 22:58

1 resposta

0

find . -type f -a \( -name "*.h" -o -name "*.C" -o -name "*.cc" -o -name "*.cpp" \) -a -exec sed -i -e 's/${2}/${3}/g' {} +

Deve funcionar.

Em seu primeiro roteiro, o problema é que, se não houver correspondência para, por exemplo, *.h , o bash passará o literal *.h para sed, que então achará que é um nome de arquivo, mas como esse arquivo não existe, ele falhará.

No segundo caso, com find(1) , você estava tendo o shell procurando por nomes de arquivos correspondentes no diretório atual e, em seguida, passá-los para encontrar (1).

    
por 20.01.2016 / 23:11