You can loop through the file using while ... do
loop:
$ while read i; do printf "Current line: %s\n" "$i"; done < target_files_list.txt
In your case you should replace printf ...
with sed
command you want.
$ while read i; do sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' "$i"; done < target_files_list.txt
However, notice that you can achieve what you want using only find
:
$ find /path/to/files/ -name "target_text_file" -exec sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' {} \;
You can read more about -exec
option by running man find | less '+/-exec '
:
-exec command ;
Execute command; true if 0 status is returned. All
following arguments to find are taken to be arguments to
the command until an argument consisting of `;' is
encountered. The string `{}' is replaced by the current
file name being processed everywhere it occurs in the
arguments to the command, not just in arguments where it
is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a `\') or
quoted to protect them from expansion by the shell. See
the EXAMPLES section for examples of the use of the
-exec option. The specified command is run once for
each matched file. The command is executed in the
starting directory. There are unavoidable security
problems surrounding use of the -exec action; you should
use the -execdir option instead.
EDIT:
As correctly noted by users
terdon and dessert in the comments
it's necessary to use -r
with read
because it will correctly
handle backslashes. It's also reported by shellcheck
:
$ cat << EOF >> do.sh
#!/usr/bin/env sh
while read i; do printf "$i\n"; done < target_files_list.txt
EOF
$ ~/.cabal/bin/shellcheck do.sh
In do.sh line 2:
while read i; do printf "\n"; done < target_files_list.txt
^-- SC2162: read without -r will mangle backslashes.
So it should be:
$ while read -r i; do sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' "$i"; done < target_files_list.txt