bash regexp用于清理一些字符

时间:2016-09-25 19:17:37

标签: regex bash sanitize

我在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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用

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

答案 2 :(得分:0)

这里的问题是正则表达式应该匹配某些东西。你写了一个模式,它既可以匹配某些东西,也可以不匹配。它不应该删除东西,只是为了匹配。

因此,您要做的是删除一些特定字符以清理字符串,这不是正则表达式的用例。 你需要的是某种String.replace(/ [^ * \?& /] /,“”),它将从你的字符串中删除所有违规字符。

假设您使用的是PHP(基于您使用的${POST_DATA}),我建议您在匹配preg_replace('/[^\*\?&\/]/','',${POST_DATA})之前使用:password=,以便删除所有违规字符。< / p>