codehaus


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Changing strings in files


On Tue, 10 Nov 2020 10:57:05 +0100
"Loris Bennett" <loris.bennett at fu-berlin.de> wrote:

> Manfred Lotz <ml_news at posteo.de> writes:
> 
> > On Tue, 10 Nov 2020 08:19:55 +0100
> > "Loris Bennett" <loris.bennett at fu-berlin.de> wrote:
> >  
> >> Manfred Lotz <ml_news at posteo.de> writes:
> >>   
> >> > I have a situation where in a directory tree I want to change a
> >> > certain string in all files where that string occurs.
> >> >
> >> > My idea was to do
> >> >
> >> > - os.scandir and for each file
> >> >    - check if a file is a text file
> >> >    - if it is not a text file skip that file
> >> >    - change the string as often as it occurs in that file
> >> >
> >> >
> >> > What is the best way to check if a file is a text file? In a
> >> > script I could use the `file` command which is not ideal as I
> >> > have to grep the result. In Perl I could do  -T file.
> >> >
> >> > How to do best in Python?    
> >> 
> >> If you are on Linux and more interested in the result than the
> >> programming exercise, I would suggest the following non-Python
> >> solution:
> >> 
> >>    find . -type -f -exec sed -i 's/foo/bar/g' {} \;
> >>   
> >
> > My existing script in Perl which I wanted to migrate to Python I
> > used `-T $file` and called sed
> >
> > I like the -T which I assume does some heuristics to tell me if a
> > file is a text file.   
> 
> Sorry, I missed the bit about text files.  By '-T' I assume you mean
> Perl's taint mode option.  I am no security expert, but as I
> understand it, taint mode does more than just check whether something
> is a text file, although the "more" probably applies mainly to files
> which contain Perl code.
> 
> Sorry also to bang on about non-Python solutions but you could do
> 
>   find . -type f -exec grep -Iq . {} \; -and -exec sed -i
> 's/foo/bar/g' {} \;
> 
> i.e. let grep ignore binary files and quietly match all non-binary
> files.
> 

Very nice. Thanks for this.

-- 
Manfred