Bash如何打印以元音开头并以数字结尾的参数

时间:2013-01-30 14:41:32

标签: linux bash grep

我正在编写一个脚本,用于打印以元音开头并以数字结尾的参数

Example : ./script Alex1GB0 Bud1GG0 Ethan8DC0 Chad5XZ7d

输出应为

Alex1GB0 Ethan8DC0 

这是我到目前为止所尝试的

 #!/bin/bash
 for x in $*; do
     o=$(echo $x | grep '\<[AEIOUaeiou]...[0-9].\>')

     if[$? -eq 0]; then
            echo $o
     fi
 done
 exit 0

它不起作用;我应该改变什么?

2 个答案:

答案 0 :(得分:2)

在bash中没有像省略号(...)那样的东西。相反,请使用.*。此外,[0-9]之后的点表示数字后面有一些内容,这违反了规范。

事实上,当我们进行模式匹配时,不需要运行子shell和grep

#! /bin/bash
for x in "$@"; do
    if [[ $x == [AEIOUaeiou]*[0-9] ]] ; then
        echo "$x"
    fi
done

答案 1 :(得分:1)

<强>的grep

grep -oP '(?<=\s)[AEIOUaeiou][^ ]*[0-9](?=\s)'

你的例子:

kent$  echo "Example : ./script Alex1GB0 Bud1GG0 Ethan8DC0 Chad5XZ7d"|grep -oP '(?<=\s)[AEIOUaeiou][^ ]*[0-9](?=\s)'
Alex1GB0
Ethan8DC0

<强> AWK

awk '{for(i=1;i<=NF;i++)if($i~/^[AEIOUaeiou][^ ]*[0-9]$/)print $i}' file

你的例子:

kent$  echo "Example : ./script Alex1GB0 Bud1GG0 Ethan8DC0 Chad5XZ7d"|awk '{for(i=1;i<=NF;i++)if($i~/^[AEIOUaeiou][^ ]*[0-9]$/)print $i}'
Alex1GB0
Ethan8DC0