如何使用sed删除行末空格?

141

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

sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp

2
你可以使用 mv 代替 catrm。你为什么要那样使用 cat 呢?为什么不使用 cp 呢? - Dennis Williamson
1
我使用了从这个问题学到的知识来创建一个递归删除行尾空格的Shell脚本 - David Tuite
1
你的解决方案在使用MinGW时实际上更好,因为Windows上的sed存在一个错误:https://dev59.com/LWYq5IYBdhLWcg3wpyNE - Cody Piersall
请注意,使用cat覆盖原始文件而不是mv实际上会替换原始文件中的数据(即,它不会破坏硬链接)。使用许多解决方案中提出的sed -i也不会这样做。换句话说,继续做你正在做的事情。 - William Pursell
12个回答

1

只是为了好玩:

#!/bin/bash

FILE=$1

if [[ -z $FILE ]]; then
   echo "You must pass a filename -- exiting" >&2
   exit 1
fi

if [[ ! -f $FILE ]]; then
   echo "There is not file '$FILE' here -- exiting" >&2
   exit 1
fi

BEFORE=`wc -c "$FILE" | cut --delimiter=' ' --fields=1`

# >>>>>>>>>>
sed -i.bak -e's/[ \t]*$//' "$FILE"
# <<<<<<<<<<

AFTER=`wc -c "$FILE" | cut --delimiter=' ' --fields=1`

if [[ $? != 0 ]]; then
   echo "Some error occurred" >&2
else
   echo "Filtered '$FILE' from $BEFORE characters to $AFTER characters"
fi

-1

只从至少有一个非空白字符的行中去除空格(在我的情况下是空格和制表符),这样空的缩进行就不会被触及:

sed -i -r 's/([^ \t]+)[ \t]+$/\1/' "$file"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接