smc*_*smc 0 shell shell-script cut
我在文件中有以下内容
foobar bar
bar foo foo
bar bar foobar
Run Code Online (Sandbox Code Playgroud)
我想从所有行中获取最后一个字符,也是最后 3 个字符。
我正在使用以下 for 循环解决方法来获得所需的输出,但我想cut
command 可以做得比这好得多。有没有办法通过剪切来做同样的事情?
$ cat test.sh
FILE=$1
echo "Last chars:"
for i in $(cat $FILE)
do
echo ${i: -1}
# OR echo $i |tail -c 2
done
echo
echo "Last 3 chars:"
for i in $(cat $FILE)
do
echo ${i: -3}
# OR echo $i |tail -c 4
done
$ sh test.sh
Last chars:
r
r
r
o
o
r
r
r
Last 3 chars:
bar
bar
bar
foo
foo
bar
bar
bar
Run Code Online (Sandbox Code Playgroud)
如果在 GNU 系统上,您可能希望避免cut
使用单字节字符才能正常工作。
你可以sed
改用:
sed -n '/^.*\(...\)$/\1/p' < file
Run Code Online (Sandbox Code Playgroud)
(在某些实现中跳过少于 3 个字符的行和可能的非文本行)。
或者包含少于 3 个字符的行,只打印存在的内容:
sed -n 's/.\{0,3\}$/\
&/; s/^.*\n//p' < file
Run Code Online (Sandbox Code Playgroud)
cut
本身在一行中没有“最后 N 个字符”的概念。但是,如果将此与rev
程序结合使用,则可以反转每一行,选择前N 个字符,然后反转结果以将事情恢复到原始顺序。
rev | cut -c 1-3 | rev
Run Code Online (Sandbox Code Playgroud)