如何管理字符串并从中删除几个字符?例如:
$ echo forbes | ... -3
for
$ echo cucumber | ... -4
cucu
$ echo 1461624333 | .. -3
1461624
...
etc.
我无法在管道中找到使用${str:0:-3}
语法的方法。
答案 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. 'ä'