有没有办法就地使用 tr 命令?

8 sed tr gawk

我想从文件中删除所有非英文字母数字。

tr -sc '[:alnum:][:punct:]' ' ' <file
Run Code Online (Sandbox Code Playgroud)

gawksed-i标志,但我在tr手册页中找不到任何类似的内容。

我该如何就地执行此操作,即将输出存储在输入文件本身中?

ter*_*don 6

没有。很少有命令具有此功能,GNU awk ( gawk) 最近才添加了它,即使对于那些具有-i或等效项的命令,它所做的也只是在后台创建一个临时文件。

所以,这样做的方法是:

tr -sc '[:alnum:][:punct:]' ' ' <file >newfile && mv newfile file
Run Code Online (Sandbox Code Playgroud)

如果您经常需要,您可以创建一个小功能:

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"
}
Run Code Online (Sandbox Code Playgroud)

然后您将其运行为:

tri -sc '[:alnum:][:punct:]' ' ' file
Run Code Online (Sandbox Code Playgroud)

请注意,与 real 不同的是tr,它期望文件名作为参数而不是重定向输入 ( <file),并且选项如上所示一起指定(而不是像-s -c)。