如何用sed删除尾随空格?

Vik*_*tor 98 whitespace sed

我有一个简单的shell脚本,可以从文件中删除尾随空格.有没有办法让这个脚本更紧凑(没有创建临时文件)?

sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
Run Code Online (Sandbox Code Playgroud)

cod*_*ict 143

您可以选择的地方使用-isedLinux和Unix:

sed -i 's/[ \t]*$//' "$1"
Run Code Online (Sandbox Code Playgroud)

请注意该表达式将删除tOSX上的尾随(您可以使用gsed以避免此问题).它也可能在BSD上删除它们.

如果你没有gsed,这是OSX上正确(但难以阅读)的sed语法:

sed -i '' -E 's/[ '$'\t'']+$//' "$1"
Run Code Online (Sandbox Code Playgroud)

三个单引号字符串最终会连接成一个参数/表达式.在bash中没有连接运算符,你只需要一个接一个地放置字符串,中间没有空格.

$'\t'解析为在bash字面制表符(使用ANSI-C引用),所以标签被正确地连接成的表达.

  • HM.从某种意义上说它也会移除所有拖尾的"t"s :) (2认同)
  • "sed:不是公认的标志:我 - "这发生在OSX上.您需要在Mac上为-i后添加备份文件的扩展名.例如:sed -i .bak的/ [\ t]*$ //'$ 1 (2认同)
  • @SeanAllred并不是在开玩笑:除非你碰巧使用GNU sed(在很多其他方面被破坏),它完全被破坏了 (2认同)

acr*_*let 55

至少在Mountain Lion上,Viktor的回答也会在一行结尾处删除字符't'.以下修复了该问题:

sed -i '' -e's/[[:space:]]*$//' "$1"
Run Code Online (Sandbox Code Playgroud)


Vik*_*tor 18

感谢codaddict建议-i选项.

以下命令解决了Snow Leopard上的问题

sed -i '' -e's/[ \t]*$//' "$1"
Run Code Online (Sandbox Code Playgroud)

  • 就像@acrollet所说的那样,除了GNU sed之外,你不能将`\ t`用于sed,并且它被解释为字母"t".该命令似乎只能起作用,可能是因为尾随空格中没有TAB,文件末尾没有`t`.不建议使用`''`而不指定备份后缀. (7认同)

Scr*_*zer 13

最好还要报价1美元:

sed -i.bak 's/[[:blank:]]*$//' "$1"
Run Code Online (Sandbox Code Playgroud)


San*_* SM 5

var1="\t\t Test String trimming   "
echo $var1
Var2=$(echo "${var1}" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo $Var2
Run Code Online (Sandbox Code Playgroud)


Pas*_* T. 5

我的 .bashrc 中有一个可以在 OSX 和 Linux 下运行的脚本(仅限 bash !)

function trim_trailing_space() {
  if [[ $# -eq 0 ]]; then
    echo "$FUNCNAME will trim (in place) trailing spaces in the given file (remove unwanted spaces at end of lines)"
    echo "Usage :"
    echo "$FUNCNAME file"
    return
  fi
  local file=$1
  unamestr=$(uname)
  if [[ $unamestr == 'Darwin' ]]; then
    #specific case for Mac OSX
    sed -E -i ''  's/[[:space:]]*$//' $file
  else
    sed -i  's/[[:space:]]*$//' $file
  fi
}
Run Code Online (Sandbox Code Playgroud)

我补充说:

SRC_FILES_EXTENSIONS="js|ts|cpp|c|h|hpp|php|py|sh|cs|sql|json|ini|xml|conf"

function find_source_files() {
  if [[ $# -eq 0 ]]; then
    echo "$FUNCNAME will list sources files (having extensions $SRC_FILES_EXTENSIONS)"
    echo "Usage :"
    echo "$FUNCNAME folder"
    return
  fi
  local folder=$1

  unamestr=$(uname)
  if [[ $unamestr == 'Darwin' ]]; then
    #specific case for Mac OSX
    find -E $folder -iregex '.*\.('$SRC_FILES_EXTENSIONS')'
  else
    #Rhahhh, lovely
    local extensions_escaped=$(echo $SRC_FILES_EXTENSIONS | sed s/\|/\\\\\|/g)
    #echo "extensions_escaped:$extensions_escaped"
    find $folder -iregex '.*\.\('$extensions_escaped'\)$'
  fi
}

function trim_trailing_space_all_source_files() {
  for f in $(find_source_files .); do trim_trailing_space $f;done
}
Run Code Online (Sandbox Code Playgroud)