검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 쉘 스크립트
참조 원문 : Unix tip: Using Bash's regular expressions

  버전 3(2004년)부터 bash는 =~ 로 표기하는 내장형 정규 표현식 비교 연산자를 갖추었습니다. 그래서 사실 스크립트에서 grep이나 sed로 하는 작업의 상당수는 이 연산자로 처리할 수 있습니다.

  다른 비교 연산자(-lt, == 등)와 마찬가지로 비교 결과가 참이면 0을 리턴합니다. 아래 예제는 $digit의 값이 하나의 숫자인지를 판별하는 것을 보여주고 있습니다.
if [[ $digit =~ [0-9] ]]; then
    echo '$digit is a digit'
else
    echo "oops"
fi

  아래는 프롬프트에 입력한 값이 숫자만으로 구성되어 있는지를 판별하는 예제입니다.
echo -n "Your answer> "
read REPLY
if [[ $REPLY =~ ^[0-9]+$ ]]; then
    echo Numeric
else
    echo Non-numeric
fi

  Bash의 정규 표현식도 상당히 복잡하게 응용해서 사용할 수 있습니다. $email 변수의 값이 이메일 주소 형식인지를 판별하는 예제입니다. 첫 번째 표현식(계정명)은 문자, 숫자, 일부 특수 문자를 받습니다. 첫 번째 ]의 오른쪽에 있는 +는 앞의 표현식에 해당하는 문자를 몇 개든지 받는다는 뜻입니다. 그 뒤에는 계정명과 이메일 도메인 사이에 @ 문자가 있는지 확인합니다. 그리고 도메인 명의 앞부분과 뒷부분 사이에 점(\.)이 있는지 확인합니다.
if [[ "$email" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]
then
    echo "This email address looks fine: $email"
else
    echo "This email address is flawed: $email"
fi

  아래는 변수의 값이 IP 주소 형태인지를 판별하는 예제입니다.
#!/bin/bash

if [ $# != 1 ]; then
    echo "Usage: $0 address"
    exit 1
else
    ip=$1
fi

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    echo "Looks like an IPv4 IP address"
elif [[ $ip =~ ^[A-Fa-f0-9:]+$ ]]; then
    echo "Could be an IPv6 IP address"
else
    echo "oops"
fi

  또한 bash는 간소화된 루프문을 제공합니다. 100번 루프하고 싶다면 아래의 문법으로 해결할 수 있습니다.
for n in {1..100}
do
    echo $n
done

  아래와 같은 표현식으로 문자나 숫자를 범위로 지정하여 루프를 처리할 수도 있습니다. 꼭 1이나 a부터 시작할 필요는 없으며, 역순으로 처리하는 것도 가능합니다.
{a..z}
{z..a}
{c..f}
{5..25}
{10..-10}

  쉘에서 아래처럼 간단히 확인해볼 수도 있습니다.
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {5..-1}
5 4 3 2 1 0 -1
2013/07/15 12:42 2013/07/15 12:42