grep -l nome de arquivo de saída com espaços

4

Eu quero fazer um loop por arquivos com

for f in 'grep -rsl "foo" . ': do sed -i -- "s/foo/bar/g" $f; done;

Mas como nomes de arquivos contêm espaços, um nome de arquivo é dividido sempre que um espaço é encontrado.

Como posso passar o nome do arquivo com seus espaços para o bloco do ?

    
por doc_id 22.04.2015 / 21:21

2 respostas

4

Para lidar com nomes de arquivos difíceis, é melhor separar os nomes dos arquivos com caracteres NUL. O% GNUgrep suporta isso com a opção --null e xargs suporta isso com a opção -0 . Assim, tente:

grep --null -rslZ "foo" | xargs -0 sed -i -- "s/foo/bar/g"

Usando um loop de shell

grep --null -rslZ "foo" | while IFS= read -r -d $'
grep --null -rslZ "foo" | xargs -0 sed -i -- "s/foo/bar/g"
' file do sed -i -- "s/foo/bar/g" "$file" done
    
por 22.04.2015 / 21:27
0

You can safely forget about for for looping over filenames with spaces.

Não necessariamente ...

IFS=$'\n' && for NAV in 'ps aux | egrep -o 'Google Chrome' | sort | uniq'; do
   open -a "$NAV" http://www.google.com
done
    
por 23.01.2016 / 00:58

Tags