Почему команда sed не заменяет шаблон внутри сценария оболочки?

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, если флаги разные. Хотя обычно они одинаковые.

0
26.05.2021, 01:01
2 ответа

Вы читаете строк, но ничего не делаете с прочитанным. Попробуйте:

#!/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/'. См.

1
28.07.2021, 11:29

В любом случае, хотя вы можете писать сложные сценарии в оболочке, лучше использовать язык, предназначенный для написания сценариев, а не для интерактивного использования. Python, Perl или Raku — мои первые идеи, когда я делаю что-то более сложное, чем несколько строк. Python популярен и доступен почти везде, как и Perl; Raku — это эволюция/переработка Perl с нуля, пока еще не столь популярная (? ).

0
28.07.2021, 11:29

Теги

Похожие вопросы