bashの正規表現その2(不完全版)
久しぶりのエントリです。bashスクリプトの正規表現・・・とかいうタイトルで5年前に書いたのですが、これは、bash自身というよりも、exprコマンドで正規表現が扱えますよ・・・という内容でした。まぁそれはそれで良いと思うのですが、実はbash自身に正規表現の機能があるってことを最近知ったので、書いてみます。
お題
データを行毎に記録したテキストファイル(例:data.txt)がある。そのテキストファイルを1行ずつ読み取って、コマンドを実行したい。ただし、#で始まる行や空行は無視したい。
入力
$ cat data.txt
one
#two
thr#ee
four
five
six#
se #ven
nine
ten
$
解答と実行結果
[[ 対象文字列 =~ 正規表現 ]]でマッチ/アンマッチの判定ができる。ポイントは、正規表現をダブルクォートで囲まない事。みたい。
$ cat regexp.sh
#!/bin/sh
TARGET_FILE="data.txt"
while read LINE
do
if [[ $LINE =~ (^#|^ *$) ]]
then
continue
else
echo "$LINE"
fi
done < $TARGET_FILE
$ ./regexp.sh
one
thr#ee
four
five
six#
se #ven
nine
ten
$
後方参照
さらには、括弧でくくった場所を${BASH_REMATCH[x]}で後方参照できる。
${BASH_REMATCH[0]} #-> マッチ全体
${BASH_REMATCH[1]} #-> 1番目の括弧
${BASH_REMATCH[2]} #-> 2番目の括弧
:
お題2
#記号を含む行を出力したい。加えて、該当行のうち#記号から行末までの文字列を抜き出したい。
解答と実行結果
$ cat ./regexp2.sh
#!/bin/bash
TARGET_FILE="data.txt"
while read LINE
do
if [[ $LINE =~ ^[^#]*(#.*)$ ]]
then
echo -n "${BASH_REMATCH[0]},"
echo "${BASH_REMATCH[1]}"
else
:
fi
done < $TARGET_FILE
$ ./regexp2.sh
#two,#two
thr#ee,#ee
six#,#
se #ven,#ven
$
メタキャラクタ
良く分からないのは、このbashの正規表現で使えるメタキャラクタです。数値の意味で\dが使えないのです。(文字'd'にマッチしちゃうみたい)どこかにbashで使える正規表現のメタキャラクタの一覧がないかなぁ。
| 固定リンク
| コメント (8)
| トラックバック (0)


最近のコメント