使用 cut 打印文件中所有行的最后 N 个字符

smc*_*smc 0 shell shell-script cut

我在文件中有以下内容

foobar bar
bar foo foo
bar bar foobar
Run Code Online (Sandbox Code Playgroud)

我想从所有行中获取最后一个字符,也是最后 3 个字符。

我正在使用以下 for 循环解决方法来获得所需的输出,但我想cutcommand 可以做得比这好得多。有没有办法通过剪切来做同样的事情?

$ 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)

Sté*_*las 6

如果在 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)


ica*_*rus 5

cut本身在一行中没有“最后 N 个字符”的概念。但是,如果将此与rev程序结合使用,则可以反转每一行,选择N 个字符,然后反转结果以将事情恢复到原始顺序。

 rev | cut -c 1-3 | rev
Run Code Online (Sandbox Code Playgroud)