bash регулярное выражение для очистки некоторых символов

У меня есть строка для сопоставления и очистки в Bash, например:

POST_DATA="password=this*pass&is/for?testing"

Я хочу сопоставить всю строку после символа = санации (исключая) эти символы *&/?

Я могу получить все после символа =, используя:

[[ ${POST_DATA} =~ ^password=(.*)$ ]] && password="${BASH_REMATCH[1]}"
echo $password

Это показывает:

this*pass&is/for?testing

Я хочу регулярное выражение, желаемый результат:

thispassisfortesting

Я пробовал некоторые исключающие шаблоны, которые не работали так:

^password=(^[^\*\?&/])*$

Любая идея? Благодарю.

3 ответа

Решение

Используйте расширение параметров, а не регулярные выражения:

#!/bin/bash
POST_DATA="password=this*pass&is/for?testing"
after_eq=${POST_DATA#*=}             # remove everything up to the first =
printf '%s\n' "${after_eq//[*&\/?]}" # remove all asterisks, ampersands, slashes and question marks

С perl:

% echo "$POST_DATA" | perl -pe 's/(?:password=|[*&\/?])//g'              
thispassisfortesting

Проблема здесь в том, что регулярные выражения должны соответствовать чему-либо. Вы пишете шаблон, он либо совпадает с чем-либо, либо нет. Это не должно удалять вещи, только чтобы соответствовать.

Таким образом, то, что вы пытаетесь сделать, а именно удалить определенные символы для очистки строки, НЕ является примером использования регулярных выражений. Что вам нужно, это какой-то тип String.replace(/[^*\?&/]/, ""), Который удалит все оскорбительные символы из вашей строки.

Предполагая, что вы работаете в PHP (на основе ${POST_DATA} вы использовали), я бы предложил использовать: preg_replace('/[^\*\?&\/]/','',${POST_DATA}) перед соответствием password= так что все оскорбительные символы удаляются.

Другие вопросы по тегам