У вас есть несколько проблем в вашем коде. Не используйте ls
в сценариях и заключайте в кавычки ваши переменные. Вы, вероятно, должны использовать $(command substitution)
вместо устаревшего синтаксиса `command substitution`
.
Если вашзадача состоит в том, чтобы заменить ý
в содержимом файла - не в его названии - sed -i
не является неправильным, но излишним;просто запишите обновленное содержимое в новое местоположение и удалите старый файл.
#!/bin/sh
for i in *.txt
do
filename=$(echo "$i" | cut -d'.' -f1)
sed 's/ý/|/g' "$i" >"${filename}.mnt" && rm "$i"
done
Если ваша система сконфигурирована для UTF-8, символ ý
может быть представлен с любой последовательностью байтов \xc3 \xbd
(представляющий U + 00FD ) или разложенную последовательность \0x79 \xcc \x81
( U + 0079 + U + 0301 ) - вы можете обнаружить, что файл содержит одно представление,в то время как ваш терминал предпочитает другой.Единственный способ убедиться в этом - изучить шестнадцатеричные байты в файле и на вашем терминале.Также вполне возможно, что ваш терминал не способен точно отображать содержимое файла.Попробуйте
bash$ printf 'ý' | xxd
00000000: c3bd
bash$ head -c 16 file | xxd
00000000: 4245 4749 4e5f 5255 4e5f 5351 4cff 4445 BEGIN_RUN_SQL.DE
Если (как здесь) вы обнаружите, что они отличаются (последний выводит один байт \xff
между "BEGIN_RUN_SQL" и "DE"), тогда тривиальный подход не будет работать.Ваш sed
может поддерживать или не поддерживать передачу буквенных шестнадцатеричных последовательностей, чтобы сказать точно , что заменить;или, возможно, попробуйте, например, Perl, если нет.