Если вы не хотите мерцания, не сбрасывайте(ESC c
)терминал в каждом цикле:
i=0
echo -e '\033c'
while : ; do
echo -e '\033[H'"test$i"
((++i))
done
Нет. Очень немногие команды имеют эту функциональность, GNU awk(gawk
)добавил ее совсем недавно, и даже для тех команд, у которых есть -i
или эквивалент, все, что он делает, это создает временный файл в фоновом режиме.
Итак, способ сделать это:
tr -sc '[:alnum:][:punct:]' ' ' <file >newfile && mv newfile file
Если вам это нужно часто, вы можете придумать какую-нибудь функцию.:
tri(){
tmpFile=$(mktemp)
echo "$@"
case $# in
## You've given tr options
4)
trOpts="$1"
set1="$2"
set2="$3"
inputFile="$4"
;;
## No options, only set1 and set2 and the input file
3)
set1="$1"
set2="$2"
inputFile="$3"
;;
## Something wrong
*)
echo "Whaaaa?"
exit 1
;;
esac
tr "$trOpts" "$set1" "$set2" < "$inputFile" > "$tmpFile" &&
mv "$tmpFile" "$inputFile"
}
Затем вы запустите это как:
tri -sc '[:alnum:][:punct:]' ' ' file
Обратите внимание, что, в отличие от настоящего tr
, здесь предполагается, что имя файла будет аргументом, а не перенаправленным вводом (<file
), и что опции будут указываться вместе, как показано выше (, а не как-s -c
).
Поскольку эта команда tr
всегда записывает столько же данных, сколько и читает, для нее должно быть безопасно записывать свои выходные данные на место:
С оболочкой ksh93
:
tr -sc '\n[:alnum:][:punct:]' '[ *]' < file 1<>; file
(здесь преобразовано в стандартный/POSIX-синтаксис [ *]
и добавлена новая строка в список сохраняемых символов, чтобы избежать создания не -текстового вывода ).
Специфический оператор 1<>;
ksh93 -аналогичен стандартному 1<>
чтению+записи -без -усечения, за исключением того, что после успешного завершения перенаправляемой команды файл усекается в текущем позиция.