如何在bash字符串choping中切断字符串的最后n个字节?

时间:2009-06-23 03:23:38

标签: bash

例如qa_sharutils-2009-04-22-15-20-39,希望切断最后20个字节,然后获取“qa_sharutils”。

我知道如何在sed中执行此操作,但为什么$A=${A/.\{20\}$/}不起作用?

谢谢!

6 个答案:

答案 0 :(得分:36)

如果你的字符串存储在名为$ str的变量中,那么这将为你提供bash中没有最后20位的子字符串

${str:0:${#str} - 20}

基本上,字符串切片可以使用

完成
${[variableName]:[startIndex]:[length]}

并且字符串的长度为

${#[variableName]}

编辑: 使用适用于文件的sed的解决方案:

sed 's/.\{20\}$//' < inputFile

答案 1 :(得分:2)

使用awk:

echo $str | awk '{print substr($0,1,length($0)-20)}'

或使用字符串操作 - echo $ {string:position:length}:

echo ${str:0:$((${#str}-20))}

答案 2 :(得分:1)

在bash的${parameter/pattern/string}语法中, pattern 是路径通配符样式,而不是正则表达式。在通配符语法中,点.只是一个文字点,花括号用于匹配选项(如正则表达式中的管道|),因此该行将简单地删除文字字符串{ {1}}。

答案 3 :(得分:1)

有几种方法可以完成基本任务。

$ str="qa_sharutils-2009-04-22-15-20-39"

如果要删除最后20个字符。此子字符串选择基于零:

$ echo ${str::${#str}-20}
qa_sharutils

从字符串右侧剥离的“%”和“%%”。例如,如果你想要basename,减去第一个“ - ”后面的任何内容:

$ echo ${str%%-*}
qa_sharutils

答案 4 :(得分:1)

类似于php中的substr('abcdefg',2-1,3):

echo 'abcdefg'|tail -c +2|head -c 3

答案 5 :(得分:0)

仅当您的最后20个字节始终为日期时。

$ str="qa_sharutils-2009-04-22-15-20-39"
$ IFS="-"
$ set -- $str
$ echo $1
qa_sharutils
$ unset IFS

或不需要第一次冲刺时。

$ echo ${str%%-*}
qa_sharutils