find
возвращает список всех файлов и всех каталогов. Вы должны ограничить свой поиск, чтобы попытаться найти файлы, которые действительно содержат строку. Вы можете попробовать добавить:
find -type f... # Doesn't return directories
find -iname "*.txt"... # returns only files ending in '.txt' (case insensitive)
Или, если вы действительно хотите пофантазировать, вы можете попробовать запускать sed только для файлов, которые действительно содержат строку, используя grep:
grep -l -r 'FCLP1025' | xargs sed -i 's/FCLP1025/FCLP1080/g'
Команда grep -r
ищет рекурсивно, и -l
перечисляет только имена соответствующих файлов. Затем xargs
использует стандартный ввод и добавляет его в качестве аргументов для следующей команды, которая аналогична {}
при использовании find -exec cmd {} \;
.
Тем не менее, протестировано в bash на linux, поэтому, если это не работает, вы можете увидеть grep --help
в git -bash/cygwin, если флаги разные. Хотя обычно они одинаковые.
Вы читаете строк, но ничего не делаете с прочитанным. Попробуйте:
#!/bin/sh
while read line
do
printf '%s\n' "$line" | sed 's/<TEST>/FOO/'
done <&0
Также вы можете изменить while read line
на
while IFS= read -r line || [ -n "$line" ]
, чтобы убедиться, что вы читаете все так, как cat testfile.txt | sed 's/<TEST>/FOO/'
. См.
В любом случае, хотя вы можете писать сложные сценарии в оболочке, лучше использовать язык, предназначенный для написания сценариев, а не для интерактивного использования. Python, Perl или Raku — мои первые идеи, когда я делаю что-то более сложное, чем несколько строк. Python популярен и доступен почти везде, как и Perl; Raku — это эволюция/переработка Perl с нуля, пока еще не столь популярная (? ).