Bash中的字符串操作

时间:2010-05-22 20:35:55

标签: bash solaris

我是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,依此类推等等

有什么建议吗?

7 个答案:

答案 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//'`
  • ,否则不要打印行
  • 以'jdk'开头的行:
  • 在仅包含“jdk-IntegerAuIntegerB”的行上
    • 将其更改为“jdk.1.IntegerA.0_IntegerB”
    • 并打印

您的样本变得更加简单:

{{1}}