파이프로 구분된 [[:alnum:]]* 목록에 대한 정규식

파이프로 구분된 [[:alnum:]]* 목록에 대한 정규식

[[:alnum:]]*변수에 파이프로 구분된 문자열을 설정하기 위한 신뢰할 수 있는 정규식은 무엇입니까? 정규식은 변수가 설정되지 않은 경우도 다루어야 합니다.

승인됨:

var="abc123|A1B2C3|sDsdSS|"
var="abc123|A1B2C3"
var="abc123"
var=""

어쩌면 일부 중복 파이프도 작동할 수 있습니다(내 지원 grep).

var="|||r44fDs||fe4REee|||"

입력 파일에서 특정 줄을 제외하기 위해 나중에 스크립트에서 이 "var" 목록을 사용합니다.

grep -vE "^(${var}) " input > input.filtered

내 정규식은 공백으로 구분된 특수 문자도 반환하는데, 이는 나에게 적합하지 않은 것 같습니다.

$ echo -e "sfsfds|sfsf|sfdsf|||\ns@ds|fsfsf|fssfsdf|sfsdfdfs\nsdfsdfsfs\nafafafs sdfsfd dfsfsfs\n"|grep -E '([[:alnum:]]*\|*)*'
sfsfds|sfsf|sfdsf|||
s@ds|fsfsf|fssfsdf|sfsdfdfs
sdfsdfsfs
afafafs sdfsfd dfsfsfs

$

답변1

grep해결책:

샘플 input.txt:

sfsfds|sfsf|sfdsf|||
s@ds|fsfsf|fssfsdf|sfsdfdfs
sdfsdfsfs
afafafs sdfsfd dfsfsfs

var='^[[:alnum:]]+[[:alnum:]\|]*$'
grep -E "$var" input.txt

산출:

sfsfds|sfsf|sfdsf|||
sdfsdfsfs

답변2

오직:

grep -x '[[:alnum:]|]*'

즉, 0개 이상의 alnum 또는 |. -E여기서는 정규식을 확장( )할 필요가 없습니다 . 이 구문은 기본 정규식과 확장 정규식 모두에 유효합니다(PCRE 및 대부분의 다른 정규식, 지원되지 않는 유일한 정규식은 [:alnum:]POSIX 문자 클래스입니다).

누락된 유일한 것은 -x행 내에서 일치하는 항목을 찾는 대신 정규식이 전체 행에서 일치하도록 강제하는 옵션입니다. 정규식 중첩이 너무 멀리 진행되었습니다. |구분된 필드가 null이 아니기를 원하는 경우 필요합니다.

grep -xE '[[:alnum:]]+(\|[[:alnum:]]+)*'

덜 명확하지만 기본 RE를 사용하여 이 작업을 수행할 수도 있습니다.

grep -x '[[:alnum:]]\{1,\}\(|[[:alnum:]]\{1,\}\)*'

답변3

이것은 작동합니다:

var='^[[:alnum:]|]*$'

관련 정보