trコマンドをその場で使用する方法はありますか?

trコマンドをその場で使用する方法はありますか?

ファイルから英語以外の英数字をすべて削除したいです。

tr -sc '[:alnum:][:punct:]' ' ' <file

gawkそしてフラグがsedありますが、-iマニュアルページにそのようなものが見つかりませんtr

これを内部でどのように実行できますか?つまり、出力を入力ファイル自体に保存しますか?

答え1

いいえ。この機能を持つコマンドはほとんどありません。 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

realとは異なり、tr入力()をリダイレクトするのではなく、引数としてファイル名が必要です。<fileオプションは上記のように(likeの代わりに-s -c)一緒に指定されます。

答え2

このtrコマンドは読み取った分だけデータを書き込むので、出力を所定の位置に書き込むのは安全です。

シェルを含むksh93:

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

(これは標準/ POSIX構文に変換し[ *]、非テキスト出力の生成を防ぐために保存する文字のリストに改行を追加します。)

ksh93特定の演算子は、リダイレクトされたコマンドが正常に完了するとファイルが現在の場所で切り捨てられることを除いて、切り捨てられていない標準の読み書き演算子に1<>;似ています。1<>

関連情報