каков надежный regex для разделенных трубкой [[:alnum:]]*
строк, установленных в переменной? regex должен также охватывать случай, когда переменная не установлена.
принято:
var="abc123|A1B2C3|sDsdSS|"
var="abc123|A1B2C3"
var="abc123"
var=""
и, возможно, также некоторые лишние трубы в порядке (поддерживается в моем grep
):
var="|||r44fDs||fe4REee|||"
Я использую этот список "var" позже в моем скрипте, чтобы исключить заданные строки из входного файла:
grep -vE "^(${var}) " input > input.filtered
Мой regex возвращает также разделенные пробелами и специальные символы, которые не в порядке для меня:
$ 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
$
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
Просто:
grep -x '[[:alnum:]|]*'
То есть любая последовательность из 0 или более выпусков или |
. Здесь вам не нужны расширенные(-E
)регулярные выражения. Этот синтаксис действителен как в базовых, так и в расширенных регулярных выражениях (, а также в PCRE и большинстве других регулярных выражений, единственное, что может не поддерживаться в некоторых, это [:alnum:]
класс символов POSIX ).
Единственное, что отсутствовало у вас, — это опция -x
, чтобы заставить регулярное выражение сопоставляться со всей строкой, а не сопоставляться внутри строки. Вложение регулярных выражений было излишним. Вам это понадобится, если вы хотите, чтобы |
поля с разделителями были не -пустыми:
grep -xE '[[:alnum:]]+(\|[[:alnum:]]+)*'
Это также можно сделать с помощью базовых RE, хотя и менее разборчиво:
grep -x '[[:alnum:]]\{1,\}\(|[[:alnum:]]\{1,\}\)*'