如何在bash脚本中获取除最后一个之外的所有字符?

时间:2017-07-20 09:15:28

标签: bash macos shell

我有一个文本文件,其中包含此文件的文件名和标签

示例字符串:
0-3081031014094495-0.png 0

我正在使用此命令迭代文本文件并获取最后一个字符。

while IFS= read -r line; do
    echo $line | tail -c 2
done <$PWD/$i/caffe/test.txt

我也希望在最后一个字符之前得到所有内容。 类似echo $line | head -c -2的东西,我将其解释为: 从头开始并获取所有内容,直到最后两个字符

修改

感谢您提供了许多非常快速的答案。在原始问题中我没有提到的是我使用的是mac。我认为这没关系,但尝试一些你的答案我意识到这很重要。

例如,在mac上使用负子串是not supported。 詹姆斯布朗解决方案是第一个为我工作的解决方案,所以这就是为什么我接受了他的答案。

4 个答案:

答案 0 :(得分:3)

在bash中获取最后一个字符之前的所有内容:

$ foo="0-3081031014094495-0.png 0" 
$ echo ${foo%?}
0-3081031014094495-0.png

来自http://tldp.org/LDP/abs/html/string-manipulation.html

$ {字符串%子}

$ string 后面删除 $ substring 的最短匹配。

答案 1 :(得分:1)

如果您的输入是空格分隔且文件名不能包含空格,read本身就足够了。

while read -r filename label; do
    printf "filename: %s label: %s\n" "$filename" "$label"
done <"$PWD/$i/caffe/test.txt"

答案 2 :(得分:0)

来自man headman tail

# head
   -c, --bytes=[-]K
          print the first K bytes of each file; with the leading `-', print all but the last K bytes of each file

# tail
   -c, --bytes=K
          output the last K bytes; alternatively, use -c +K to output bytes starting with the Kth of each file

实施例

$ tail -c -2 <<< 'hello world!'
!
$ head -c -2 <<< 'hello world!'; echo
hello world

然而,使用shell扩展可以更有效地获得最后一个char以及除最后一个char之外的所有char

$ line='hello world!'
$ echo "${line:${#line}-1}"
$ echo "${line:0:${#line}-1}"

答案 3 :(得分:0)

最简单的解决方案是使用rev(1),即:

$ echo "$line" | rev | cut -c 1 | rev
0

您也可以将行长度传递给cut,即:

$ echo "$line" | cut -c ${#line}
0

或者减少最后几个字符:

$ echo "$line" | cut -c $((${#line} - 2))-
g 0