我有一个变量设置为var='type_cardio_10-11-2017'
.我需要从变量中删除最后 10 个字母,并将剩余的值附加到var2
.
我尝试使用以下脚本,但它没有按预期工作。
var=type_cardio_10-11-2017
var2=${var} | cut -f1 -d "_"
echo ${var2}
我想要的输出是心脏类型。
答案1
要删除最后一个之后的所有内容_
并将var
结果分配给var2
:
var2=${var%_*}
参数扩展从给定变量值的末尾${parameter%word}
删除模式word
(在本例中)。_*
POSIX 标准称其为“删除最小的后缀模式”参数扩展。
要删除最后一个下划线及其后面的 10 个字符,请使用
var2=${var%_??????????}
要删除与日期字符串(例如示例中的字符串)相对应的字符,请使用
var2=${var%_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]}
您使用哪种模式取决于您想要执行匹配的仔细程度。
答案2
您实际上想删除尾随11字符串中的字符;这是另一种方法:
$ var=type_cardio_10-11-2017
$ var2=${var%???????????}
$ echo "$var2"
type_cardio
答案3
另一种方法bash
:
echo "${var::-10}"
或者在旧版本中:
echo "${var::${#var}-10}" #or
echo "${var: : -10}"
答案4
附加var
和var2
是最简单的部分 - 您可以像这样加入它们new_var="$var$var2"
。如果你什么真的意思是说你想要店铺裁剪var
成var2
,然后就可以了var2=$(...)
,您可以将其他用户和我的答案在此处呈现的命令放入该$()
部分内。
主要部分是删除这 10 个字符。有多种方法可以从中提取您想要的部分var
:
printf
(非常便携,不依赖特定的 shell)$ printf "%.11s\n" "$var" type_cardio
awk
$ var=type_cardio_10-11-2017 $ awk -v awk_var="$var" 'BEGIN{print substr(awk_var,0,length(awk_var)-11)}' type_cardio
或者你
printf
也可以在这里使用技巧:$ echo "$var" | awk '{printf "%.11s\n",$0}' type_cardio
egrep
$ echo "$var" | egrep -o '^.{0,11}' type_cardio
perl
:$ echo "$var" | perl -lne 'print substr($_,0,11)' type_cardio
python
:$ python -c 'import sys;print sys.argv[1][0:11] ' "$var" type_cardio