我是Bash的新手,我正在做一些字符串操作。
我的目录中的其他文件中包含以下文件:
jdk-6u20-solaris-i586.sh
我正在执行以下操作以在我的脚本中获取jdk-6u20:
myvar=`ls -la | awk '{print $9}' | egrep "i586" | cut -c1-8`
echo $myvar
但现在我想将jdk-6u20转换为jdk1.6.0_20。我似乎无法弄明白该怎么做。
它必须尽可能通用。例如,如果我有jdk-6u25,我应该能够以相同的方式将其转换为jdk1.6.0_25,依此类推等等
有什么建议吗?
答案 0 :(得分:2)
根据您想要的通用程度以及输入的标准,您可以使用AWK
来执行所有操作。通过使用FS="regexp"
指定字段分隔符,您可以通过任何令牌最有意义的标记来细分原始字符串,并使用printf
以任何顺序将它们重新组合在一起。
例如,假设两个破折号和字母'u'仅用于分隔字段:
myvar="jdk-6u20-solaris-i586.sh"
echo $myvar | awk 'BEGIN {FS="[-u]"}; {printf "%s1.%s.0_%s",$1,$2,$3}'
根据口味调味。
答案 1 :(得分:1)
仅使用Bash:
for file in jdk*i586*
do
file="${file%*-solaris*}"
file="${file/-/1.}"
file="${file/u/.0_}"
do_something_with "$file"
done
答案 2 :(得分:0)
我认为
sed是你的命令
答案 3 :(得分:0)
awk 'if(match($9,"i586")){gsub("jdk-6u20","jdk1.6.0_20");print $9;}'
if(match())取代egrep位,如果你想使用它。您可以使用substr($ 9,1,8)而不是cut。
答案 4 :(得分:0)
garph0与sed
有一个好主意;你可以做到
myvar=`ls jdk*i586.sh | sed 's/jdk-\([0-9]\)u\([0-9]\+\).\+$/jdk1.\1.0_\2/'`
答案 5 :(得分:0)
您可以尝试以下代码段:
for fname in *; do
newname=`echo "$fname" | sed 's,^jdk-\([0-9]\)u\([0-9][0-9]*\)-.*$,jdk1.\1.0_\2,'`
if [ "$fname" != "$newname" ]; then
echo "old $fname, new $newname"
fi
done
答案 6 :(得分:0)
您需要awk
-l
ls
切换sed
。对于文本行上的模式替换,ls | sed -n '/^jdk/s/jdk-\([0-9][0-9]*\)u\([0-9][0-9]*\)$/jdk1.\1.0_\2/p'
是长期的冠军:
-n
这是用“old-school”sed编写的,它应该具有跨平台的更大可移植性。表达说:
myvar=`echo *solaris-i586.sh | sed 's/-solaris-i586\.sh//'`
您的样本变得更加简单:
{{1}}