У меня есть скрипт bash, который перечисляет все файлы * .php в каталоге и применяется iconv
к нему. Это получает вывод в STDOUT.
Поскольку при добавлении -o
параметра (по моему опыту) фактически записывается пустой файл, вероятно, до того, как произойдет преобразование, как я могу настроить свой сценарий так, чтобы он выполнял преобразование, а затем перезаписывал входной файл?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
shell
text-processing
io-redirection
медер омуралиев
источник
источник
Ответы:
Это не работает, потому что
iconv
сначала создается выходной файл (поскольку файл уже существует, он усекает его), а затем начинает читать его входной файл (который теперь пуст). Большинство программ ведут себя так.Создайте новый временный файл для вывода, затем переместите его на место.
Если ваша платформа
iconv
не имеет-o
, вы можете использовать перенаправление оболочки для того же эффекта.sponge
Утилита Колина Уотсона (включена в moreutils Джои Хесса ) автоматизирует это:Этот ответ относится не только
iconv
к любой программе фильтрации. Стоит упомянуть несколько особых случаев:-p
имеют-i
возможность заменить файлы на месте.grep
,tr
,sed 's/long input text/shorter text/'
), и вам нравится жить опасно, вы можете действительно изменить файл в месте (другие решения , упомянутые здесь , создают новый выходной файл и переместите его на место в конце, чтобы исходные данные не изменялись, если по какой-либо причине команда была прервана).источник
sponge
должно ли авторство принадлежать исключительно Джои Хесс; это пакет,moreutils
который включает в себя,sponge
что он поддерживает, но что касается происхожденияsponge
, то, следуя ссылкам с домашней страницыmoreutils
, я обнаружил, что он изначально размещен и предложен для включения Колином Уотсоном: «Джои пишет об отсутствии новых инструментов, которые вписывается в философию Unix. Мои любимые вещи, которые я написал,sponge
"(понедельник, 6 февраля 2006 г.).iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
, довольно умны в отношении-o
параметров, и если они обнаруживают, что выходной файл совпадает с вводом, они внутренне управляют временным файлом, поэтому он просто работает.Альтернатива
recode
, которая использует библиотеку libiconv для некоторых преобразований. Его поведение заключается в замене входного файла с выходным, так что это будет работать:Поскольку
recode
принимает несколько входных файлов в качестве параметра, вы можете сэкономитьfor
цикл:источник
info recode
вместо этого. Более многословно.Сейчас
работает как шарм
источник
Вы можете использовать Vim в режиме Ex:
%
выбрать все строки!
Команда Runx
сохранить и закрытьисточник
Вот простой пример . Это должно дать вам достаточно информации, чтобы начать.
источник
работает для меня
источник
Вы можете использовать find, по крайней мере, это сработало для меня на Raspbian Stretch:
источник
Одним из вариантов является использование
perl
интерфейсаiconv
и его-i
режима для редактирования на месте:С GNU
awk
вы также можете сделать что-то вроде:В
ksh93
оболочке также есть>;
оператор для того, что сохраняет выходные данные во временном файле, который переименовывается в перенаправленный файл, если команда была успешной:источник