ユーザー入力の特定のビットでRegExpパターンテストを実行する必要があります。これは、値をテストする必要があるパターンです。
^([a-z]{2,3})\-([a-z][a-z]*[0-9]*)\-(\d+)$
一致の例は次のようになります:na-examplename-01
私が利用できるシェルはBusyBox a.k.a ashなので、完全なbash機能はありません。
BusyBoxを使用する場合のRegExpパターンテストのオプションは何ですか?
注: exprはインストールで使用できないため、使用できません。
次の機能を利用できます。
arp, ash, awk, basename, bash, bunzip2, bzcat, bzip2, cat, chmod,
chown, chvt, clear, cp, crond, crontab, cryptpw, cut, date, dd,
deallocvt, df, dirname, dmesg, dnsdomainname, dos2unix, du, egrep,
eject, env, fbset, fgconsole, fgrep, find, findfs, flock, free, fstrim,
ftpget, ftpput, fuser, getopt, grep, groups, gunzip, gzip, head,
hostname, httpd, hwclock, id, ifconfig, ifdown, ifplugd, ifup, install,
ionice, iostat, ip, kill, killall, killall5, less, ln, loadkmap,
logger, login, ls, lsof, md5sum, mkdir, mkdosfs, mkfifo, mkfs.vfat,
mknod, mkpasswd, mkswap, mktemp, more, mount, mountpoint, mpstat, mv,
nbd-client, nc, netstat, Nice, Nohup, nslookup, ntpd, od, pgrep, pidof,
ping, ping6, pmap, printenv, ps, pstree, pwd, pwdx, rdate, readlink,
realpath, renice, reset, rm, rmdir, route, sed, seq, setconsole,
setserial, sh, sleep, smemcap, sort, stat, su, switch_root, sync,
sysctl, tail, tar, tee, telnet, time, top, touch, tr, traceroute,
traceroute6, true, ttysize, umount, uname, uniq, unix2dos, unxz,
uptime, usleep, vconfig, vi, watch, wc, wget, which, whoami, whois,
xargs, xz, xzcat, zcat
正規表現を実行できる3つのツールがあります。これらはすべて、$in
にna-examplename-01
が含まれていることを前提としています。
グレップ
$ printf "%s\n" "$in" | ./grep -E '^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$'
na-examplename-01
sed
$ printf "%s\n" "$in" | ./sed -n '/^[a-z]\{2,3\}-[a-z]\+[0-9]*-[0-9]\+$/p'
na-examplename-01
awk
$ printf "%s\n" "$in" | ./awk '/^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$/'
na-examplename-01
これらは$in
のコンテンツ全体とは対照的に、$in
内の各行で一致することに注意してください。たとえば、次のように定義された$in
の2行目と3行目で一致します。
in='whatever
xx-a-1
yy-b-2'
Stéphaneが彼の回答で指摘したように、これらのコマンドの前にLC_ALL=C
を追加して、ロケールが文字範囲を混乱させないようにすることをお勧めします。
awk
は良い候補のようです:
input='whatever
even spaces
and newlines
xxx-blah12-0' # should not match
input='na-examplename-01' # should match
if
LC_ALL=C awk '
BEGIN{
exit(!(ARGV[1] ~ /^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$/))
}' "$input"
then
echo it matches
else
echo >&2 it does not match
fi
次のように、拡張正規表現モードでgrep
を使用できます。
echo na-examplename-01 | grep -E '^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$'
これを読みやすくするには、intervalパラメータを使用する必要があります。 [a-z][a-z]|[a-z][a-z][a-z]
は[a-z]{2,3}
になります。
[a-z]+
は[a-z][a-z]*
と同じです
Grep snytaxについては、 https://www.gnu.org/software/findutils/manual/html_node/find_html/grep-regular-expression-syntax.html をご覧ください。