【问题标题】:Removing 2 last characters from a string从字符串中删除最后两个字符
【发布时间】:2016-01-21 21:20:12
【问题描述】:

我正在尝试从两个来源制作目录列表。另一个目录的条目后面可以有 -1 或 -2,我想删除它们。

ls 输出示例:

something.something.anything-1
stuff.stuff.stuff.morestuff-2
st.uf.f

我现在拥有的代码:

echo -e "\tDATA\t\t | \t\tSYSTEM"
for SYSTEM in `ls /system/app`; do
    for DATA in `ls /data/app | sed 's/-1*$//' | sed 's/-2*$//'`; do
        echo -n "$DATA | " 
    done
    echo "$SYSTEM"
done

它工作得很好,但如果有更好的方法,我很好奇,因为我必须使用 sed 两次。而且我注意到这里并没有很多好的帖子可以使用命令从字符串中删除字符,这可能是分享您的想法的好地方。

更新:

更新后的代码:

echo -e "\tDATA\t\t | \t\tSYSTEM"
for SYSTEM in `ls /system/app`; do
    for DATA in `ls /data/app | sed 's/-[[:digit:]]*$//'`; do
        echo -n "$DATA | " 
    done
    echo "$SYSTEM"
done

Wich 完美!

【问题讨论】:

  • Don't parse lss/-[12]*$//
  • 哦,那很方便 :D 谢谢!
  • 如果您只想删除 -1-2 而不是 -12-,请使用 sed s/-[12]$//
  • @karakfa 你不应该使用-\?,因为它们也可能是积极的吗?

标签: bash sed ls


【解决方案1】:

如果您只想删除任何字符串的最后 2 位数字,请使用:

$ echo -e "Hello-1\nHello-2" | sed 's/..$//'
Hello
Hello

【讨论】:

  • 这很好,但条目后面可能没有 -1 或 -2。我看到我的问题中没有解释,所以我会更新它。谢谢
【解决方案2】:

如果您想始终删除最后两个字符:

echo "abcdefg" | sed 's/..$//g'
> abcde

或者您可以对所有数字使用更严格的正则表达式

echo "abcdefg-2" | sed 's/-[[:digit:]]$//g'
> abcdefg

或者只是这两个:

echo "abcdefg-2" | sed 's/-[12]$//g'
> abcdefg

【讨论】:

    【解决方案3】:

    因为你已经将你的字符串存储在一个变量中,你可以使用 bash 的内置方式来处理它:

    kent$  x="1234567"    
    kent$  echo ${x: :-2}
    12345
    

    【讨论】:

    • 好答案。或者,符合 POSIX 的方式是:${x%??}。请注意,这与您的答案略有不同(如果 $x 的长度小于 2,则会失败)。
    • 但这不适用于旧 bash 版本,并且该脚本应该是通用的。
    【解决方案4】:

    使用参数扩展:

    toto="abcd-1"
    echo ${toto/%-[12]}
    

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2017-02-22
      • 2017-08-19
      • 2020-03-18
      • 1970-01-01
      • 2015-08-22
      相关资源
      最近更新 更多