RegExp 테스트를 위해 Ash Shell(BusyBox) 사용

RegExp 테스트를 위해 Ash Shell(BusyBox) 사용

특정 사용자 입력에 대해 RegExp 패턴 테스트를 수행해야 합니다. 이것이 값을 테스트하는 데 필요한 패턴입니다.

^([a-z]{2,3})\-([a-z][a-z]*[0-9]*)\-(\d+)$

일치 예시는 다음과 같습니다.na-examplename-01

내가 사용할 수 있는 쉘은 BusyBox(일명 ash)이므로 전체 bash 기능이 없습니다.

BusyBox를 사용할 때 어떤 RegExp 모드 테스트 옵션을 사용할 수 있나요?

노트:내 설치에서는 expr을 사용할 수 없기 때문에 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

답변1

정규식을 수행할 수 있는 세 가지 도구가 있습니다. 이것들은 $in포함되어 있는 것으로 추정됩니다 na-examplename-01.

  1. grep

    $ printf "%s\n" "$in" | ./grep -E '^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$'
    na-examplename-01
    
  2. sed

    $ printf "%s\n" "$in" | ./sed -n '/^[a-z]\{2,3\}-[a-z]\+[0-9]*-[0-9]\+$/p'
    na-examplename-01
    
  3. $ 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'

LC_ALL=CStéphane이 답변에서 지적했듯이 로케일이 문자 범위를 혼동하지 않도록 이러한 명령 앞에 접두사를 붙이는 것이 가장 좋습니다 .

답변2

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

답변3

grep다음과 같이 확장 정규식 모드에서 사용할 수 있습니다 .

echo na-examplename-01 | grep -E '^[a-z]{2,3}-[a-z]+[0-9]*-[0-9]+$'

더 쉽게 읽을 수 있도록 간격 매개변수를 사용해야 합니다. [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

관련 정보