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=
так что все оскорбительные символы удаляются.