【问题标题】:How can I remove trailing characters from a string using shell script?使用 shell 脚本剪切字符串中的最后 n 个字符
【发布时间】:2012-12-29 14:12:09
【问题描述】:

如何使用 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

【问题讨论】:

    标签: bash shell cut


    【解决方案1】:

    要回答你的问题标题指定剪切字符串中的最后 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 子字符串删除方法。

    【讨论】:

    • 请注意,第一个解决方案仅适用于较新版本的 Bash (>= 4.2-alpha)。
    • 对于旧版本:使用 #item 获取字符串的长度,因此如果您尝试删除最后 n 个字符,请像 item="abcdefgh" echo ${item:0:${ #it​​em}-n};
    • 我知道这是微不足道的,但我想我会在这里陈述它,因为它让我绊倒了。确保你把分号放在最后,就像 rivu 一样!我忘记了分号并得到了各种各样的错误!
    • @user972276:end 不需要分号,但您确实需要分号来在一行中分隔多个命令。因此,rivu 在一行上的完整 Bash 3.x 示例是:n=2; item='abcdefgh'; echo "${item:0:${#item}-n}"
    【解决方案2】:

    sed:

    sed 's/,\+$//' file
    

    【讨论】:

    • 效果很好,但仅适用于 GNU sed。符合 POSIX 的重新表述是 sed 's/,\{1,\}//'。适用于 GNU 和 BSD/OSX 的版本 sed: sed -E 's/,+//'
    【解决方案3】:

    使用 sed:

    sed 's/,,*$//g' file 
    

    【讨论】:

      【解决方案4】:

      我猜你需要删除那些不必要的,'s

      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
      > 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多