我有一个文本文件,其中包含此文件的文件名和标签
示例字符串:
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。 詹姆斯布朗解决方案是第一个为我工作的解决方案,所以这就是为什么我接受了他的答案。
答案 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 head
和man 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