例如qa_sharutils-2009-04-22-15-20-39
,希望切断最后20个字节,然后获取“qa_sharutils
”。
我知道如何在sed中执行此操作,但为什么$A=${A/.\{20\}$/}
不起作用?
谢谢!
答案 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