Есть ли способ использовать команду tr на месте?

Если вы не хотите мерцания, не сбрасывайте(ESC c)терминал в каждом цикле:

i=0
echo -e '\033c'
while : ; do
    echo -e '\033[H'"test$i"
    ((++i))
done
2
11.01.2020, 15:05
2 ответа

Нет. Очень немногие команды имеют эту функциональность, 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).

6
27.01.2020, 21:58

Поскольку эта команда trвсегда записывает столько же данных, сколько и читает, для нее должно быть безопасно записывать свои выходные данные на место:

С оболочкой ksh93:

tr -sc '\n[:alnum:][:punct:]' '[ *]' < file 1<>; file

(здесь преобразовано в стандартный/POSIX-синтаксис [ *]и добавлена ​​новая строка в список сохраняемых символов, чтобы избежать создания не -текстового вывода ).

Специфический оператор 1<>;ksh93 -аналогичен стандартному 1<>чтению+записи -без -усечения, за исключением того, что после успешного завершения перенаправляемой команды файл усекается в текущем позиция.

2
27.01.2020, 21:58

Теги

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