通过删除最后N个字符来管出子字符串

时间:2016-04-25 23:25:42

标签: bash unix

如何管理字符串并从中删除几个字符?例如:

$ echo forbes | ... -3
for
$ echo cucumber | ... -4
cucu
$ echo 1461624333 | .. -3 
1461624
...
etc.

我无法在管道中找到使用${str:0:-3}语法的方法。

4 个答案:

答案 0 :(得分:7)

管道到sed:

$ echo forbes | sed 's/...$//'
for

这匹配字符串的最后三个字符并删除它们(用空字符串替换)。

要参数化要删除的字符数,我们可以将它包装在一个小函数中:

pipesubstr () {
    sed "s/.\{$1\}$//"
}

使用如下:

$ echo forbes | pipesubstr 3
for
$ echo cucumber | pipesubstr 4
cucu
$ echo 1461624333 | pipesubstr 3
1461624

答案 1 :(得分:2)

使用cut

$ echo "forbes" | cut -b 1-3
for

<强>更新

要从后面刮胡子,你可以这样做:

echo "forbes" | rev | cut -c (n+1)- | rev

其中n是您要从结尾处理的字符数

echo "forbes" | rev | cut -c 4- | rev
for

答案 2 :(得分:2)

GNU head是另一种选择(从输入字符串中删除最后的n个字符 - 即使它跨越多行):

$ printf '1461624333' | head -c -3   # drop last 3 chars.
1461624

请注意,如果您使用echo代替printf,则必须考虑尾随\n,因此您必须将1添加到计数中(以及输出将没有尾随\n)。

警告: head -c字节进行操作,因此仅适用于ASCII字符和其他单字节编码。

答案 3 :(得分:0)

awk解决方案(从输入中的每一行中移除最后n个字符):

$ echo '1461624333' | awk -v n=3 '{ print substr($0, 1, length($0)-n) }' # drop last 3 
1461624

警告:并非所有awk实现都是区域设置感知的;例如,在OS X 10.11.4上找到的BSD awk不是:

$ echo 'usä' | awk -v n=1 '{ print substr($0, 1, length($0)-n) }'
us? # !! on OSX, mistakenly returns the first byte of multi-byte UTF8 char. 'ä'