bash 用于清理一些字符的正则表达式

bash regexp for cleaning some chars

我在 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=(^[^\*\?&/])*$

有什么想法吗?谢谢。

使用参数扩展而不是正则表达式:

#!/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

:

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

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

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

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