sed:删除除最后 n 个字符之外的所有字符

sed: remove all characters except for last n characters

我正在尝试删除文本字符串中除剩余 11 个字符之外的所有字符。字符串是 Sample Text_that-would$normally~be,here--pe_-l4_mBY 而我想要结束的只是 -pe_-l4_mBY.

这是我尝试过的方法:

$ cat food
Sample Text_that-would$normally~be,here--pe_-l4_mBY
$ cat food | sed 's/^.*(.{3})$//'
sed: 1: "s/^.*(.{3})$//":  not defined in the RE

请注意,文本字符串并没有真正存储在文件中,我只是以 cat food 为例。

OS 是 macOS High Sierra 10.13.6 和 bash 版本是 3.2.57(1)-release

您可以将此 sed 与捕获组一起使用:

sed -E 's/.*(.{11})$//' file

-pe_-l4_mBY

还有 rev/cut/rev

$ echo abcdefghijklmnopqrstuvwxyz | rev | cut -c1-11 | rev 

pqrstuvwxyz

man rev => rev - reverse lines characterwise

基本正则表达式(sed默认使用)要求捕获组中的括号和大括号表达式中的大括号都被转义。 ({ 被视为要匹配的文字字符。

$ cat food | sed 's/^.*\(.\{3\}\)$//'
mBY

相比之下,明确要求 sed 使用带 -E 选项的扩展正则表达式会颠倒意思,\(\{ 是原义字符。

$ cat food | sed -E 's/^.*(.{3})$//'
mBY

也试试这个:

grep -o -E '.{11}$' food

grepsed 一样,接受任意数量的文件名参数,因此不需要单独的 cat。 (另见 useless use of cat.)

您可以使用尾部或参数扩展:

string='Sample Text_that-would$normally~be,here--pe_-l4_mBY'
echo "$string" | tail -c 11
echo "${string#${string%??????????}}"

pe_-l4_mBY
pe_-l4_mBY