在Linux中删除行末的空格

52

我有一个文件,我想从行末删除空格。 test.txt的内容如下(行末有空格)。

ath-miRf10005-akr 
ath-miRf10018-akr 
ath-miRf10019-akr
ath-miRf10020-akr 
ath-miRf10023-akr
ath-miRf10024-akr 

我使用了sed 's/$\s//',但它没有起作用。


1
我认为命令应该是 sed 's/\s*$//'$ 表示行尾锚点,因此每行后面都没有任何内容。 - user1019830
正确的$定义了对象(工作缓冲区)的结尾,因此在结尾之后没有任何内容。出于同样的原因,在开头(^)之前也没有任何内容,因此如果存在,则任何模式都具有^作为第一个元素,并且如果存在,则以$结尾(为了符合POSIX标准,当使用某些操作如| [逻辑OR]时不是这样)。 - NeronLeVelu
6个回答

78

使用简单的空白*[:blank:]*来移除行尾可能存在的所有空格:

sed 's/ *$//' file

使用[:blank:]类可以删除空格和制表符:

sed 's/[[:blank:]]*$//' file
请注意,这是POSIX标准,因此在GNU sed和BSD中均兼容。
对于仅使用GNU sed,您可以使用GNU扩展\s*来匹配空格和制表符,如BaBL86的答案所述。请参阅关于基本正则表达式的POSIX规范。
让我们使用一个简单的文件进行测试,其中只有两行有空格,最后一行还有制表符:
$ cat -vet file
hello   $
bye   $
ha^I  $     # there is a tab here

仅移除空格:

$ sed 's/ *$//' file | cat -vet -
hello$
bye$
ha^I$       # tab is still here!

去掉空格和制表符:

$ sed 's/[[:blank:]]*$//' file | cat -vet -
hello$
bye$
ha$         # tab was removed!

1
只是好奇:这对于\t和类似的空格字符有效吗?使用[:space:]呢? - user1019830
1
很好的问题,@HermanTorjussen。我注意到你需要使用[[:space:]]来实现。 - fedorqui
4
字符类[:space:]包含所有的空白字符(包括换行和回车符)--[:blank:]只包括水平空白字符(空格和制表符)--请参阅 https://en.wikipedia.org/wiki/Regular_expression#Character_classes - glenn jackman
我应该执行以下操作吗:sed 's/[[:blank:]]*$//' file > file 来更新文件?@fedorqui - alper
1
@alper nop,“whatever file > file”将不可避免地截断“file”。您可以使用“sed -i.bak '...' file”进行原地编辑,或者使用“sed '...' file > new_file”。 - fedorqui
正如Glenn所说,根据你的操作系统(nix,Mac,Win)和文件编码(ASCII,UTF-8,UTF-16等),行尾可能是不同的组合[\n\r],使用[:blank:]sed命令并不能保证成功。然而,通过确保文件和终端使用相同的字符集编码,您可以使用**[:space:]**将行尾转换为所需格式,并删除空格。 - not2qubit

18

试试这个:

sed -i 's/\s*$//' youfile.txt

在 macOS 上:

sed -i '' 's/\s*$//' youfile.txt

谢谢你,这正是我所需要的。 - Natim
4
在OSX上使用GNU sed对我无效。 - stiemannkj1
OSX 版本会在行尾删除 s - Jeffrey

2
如果你的行正好是你所描述的那样(没有前导或嵌入的空格),则以下内容应该也适用。
awk '{$1=$1;print}' file.txt

可以缩短为 awk '{$1=$1}1' file.txt - Jotne

2
sed -i 's/[[:blank:]]\{1,\}$//' YourFile

[:blank:]是用于空格、制表符等,{1,}则是为了在替换过程中排除掉结尾处没有空格的情况(如果行比较短且文件比较小,则影响不大)。


0
这可能适用于您(GNU sed):
sed -ri  '/\s+$/s///' file

这个函数查找行末的空格,如果存在则将其删除。


-1

尝试使用

cat kb.txt | sed -e 's/\s$//g'

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