Regular-Expression
使用 ash shell (BusyBox) 進行 RegExp 測試
我需要對某些使用者輸入進行 RegExp 模式測試。這是我需要測試值的模式。
^([a-z]{2,3})\-([a-z][a-z]*[0-9]*)\-(\d+)$
一個範例匹配是:
na-examplename-01
我可用的 shell 是 BusyBox aka 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
您擁有三個可以執行正則表達式的工具。這些都假設
$in
包含na-examplename-01
.
- 緊握
$ printf "%s\n" "$in" | ./grep -E '^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$' na-examplename-01
- 但
$ 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
定義為的第二行和第三行in='whatever xx-a-1 yy-b-2'
正如 Stéphane 在他的回答中指出的那樣,最好在這些命令前面加上
LC_ALL=C
以確保您的語言環境不會混淆字元範圍。