13

如何使用 shell 脚本从特定字符串中删除最后n 个字符?

这是我的输入:

ssl01:49188,,,
ssl01:49188,
ssl01:49188,,,,,
ssl01:49188,ssl999999:49188,,,,,
ssl01:49188,abcf999:49188,,,,,

输出应采用以下格式:

ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188,ssl999999:49188
ssl01:49188,abcf999:49188
4

4 回答 4

42

要使用指定切割字符串中的最后 n 个字符来回答您的问题的标题,您可以使用 Bash 中的子字符串提取功能。

me@home$ A="123456"
me@home$ echo ${A:0:-2}  # remove last 2 chars
1234

但是,根据您的示例,您似乎想要删除所有尾随逗号,在这种情况下您可以使用sed 's/,*$//'.

me@home$ echo "ssl01:49188,ssl999999:49188,,,,," | sed 's/,*$//'
ssl01:49188,ssl999999:49188

或者,对于纯粹的 Bash 解决方案,您可以使用子字符串删除:

me@home$ X="ssl01:49188,ssl999999:49188,,,,,"
me@home$ shopt -s extglob
me@home$ echo ${X%%+(,)}
ssl01:49188,ssl999999:49188

sed如果需要将转换应用于整个文件,我将使用该方法,如果目标字符串已经在 bash 变量中,则使用 bash 子字符串删除方法。

于 2013-01-15T13:11:29.600 回答
11

sed

sed 's/,\+$//' file
于 2013-01-15T13:09:00.393 回答
1

我想你需要删除那些不必要,

sed 's/,,//g;s/\,$//g' your_file

测试:

> cat temp
ssl01:49188,,,
ssl01:49188,
ssl01:49188,,,,,
ssl01:49188,,,
ssl01:49188,
ssl01:49188,,,,,
ssl01:49188,ssl999999:49188,,,,,
ssl01:49188,abcf999:49188,,,,,
> sed 's/,,//g;s/\,$//g' temp
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188,ssl999999:49188
ssl01:49188,abcf999:49188
> 
于 2013-01-15T13:09:20.447 回答
1

使用 sed:

sed 's/,,*$//g' file 
于 2013-01-15T13:13:55.477 回答