Заменить специальный символ - PullRequest
0 голосов
/ 12 февраля 2019

В моем файле .txt есть специальный символ.

Я хочу заменить этот специальный символ ý на | и переименовать файл в .mnt из .txt.

Вот мой код: он переименовывает файл в .mnt, но не заменяет специальный символ

#!/bin/sh
for i in `ls *.txt 2>/dev/null`;
do
filename=`echo "$i" | cut -d'.' -f1`
sed -i 's/\ý/\|/g' $i
mv $i ${filename}.mnt
done

Как это сделать?

Пример:

BEGIN_RUN_SQLýDELETE FROM PRC_DEAL_TRIG WHERE DEAL_ID = '1:2:1212'

1 Ответ

0 голосов
/ 12 февраля 2019

У вас есть несколько проблем в вашем коде. Не используйте 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, если нет.

...