从字符串中删除最后 2 个字符

Removing 2 last characters from a string

我正在尝试从两个来源创建目录列表。另一个目录的条目后面可以有 -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

非常完美!

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

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

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

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

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

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

或者只有这两个:

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

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

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

使用参数扩展:

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