以下SED模式究竟做了什么?

时间:2015-04-29 07:14:03

标签: regex bash sed pattern-matching cgi

我正在研究CGI脚本,在我之前处理过这个问题的开发人员使用了SED模式。

COMMAND=`echo "$QUERY_STRING" | sed -n 's/^.*com_tex=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`

此处com_tex是HTML中文本框的名称。

这一行的作用是从HTML文本框中取值并将其分配给SHELL变量。显然(不确定)SED模式是从HTML中提取值而没有其他不必要的随附内容所必需的。

我也会提到这个问题。我输入命令的文本区域使用相同的模式,我需要完全按原样检索它。然而它变得混乱了。例如。如果我在文本框中输入以下命令:

  

/ usr / bin / free -m>> /home/admin/memlog.txt

存储在变量中的值是:

  

%2Fusr%2Fbin%2Ffree + -m +%3E%3E +%2Fhome%2Fadmin%2Fmemlog.txt

我们所有人都可以得到/正被%2F取代,空格由+和>取代签署%3E。

但我无法弄清楚如何在上面的模式中指定!有人请告诉我这种模式是如何工作的,或者我应该用什么样的模式代替,以便我得到输入的命令而不是我得到的输出?

2 个答案:

答案 0 :(得分:1)

 sed -n

-n切换意味着"不打印"

's/

用于替换,/是分隔符,因此命令看起来像是 s/Thing to sub/subsitution/optional extra command

^.*com_tex=

^表示行的开头
.*表示匹配0或更多任何字符
因此,它将匹配从行首开始的最长字符串com_tex=

\(\)

这是一个捕获组,保存这些括号内的任何内容都可以在以后使用

[^&]*

[^]在方括号内使用帽子时,表示与括号内的任何字符都不匹配 *与之前相同意味着0或更多匹配

捕获组与此相结合意味着捕获除&之外的任何字符。

 .*$

$之外的第一位相同意味着该行的结尾,因此这将匹配所有内容直到结束

/\1/p' 

第二个/之后是替换。 \1是之前的捕获组,因此这将替换我们在第一部分(整行)中与捕获组匹配的所有内容。 p表示打印,必须明确说明,因为-n开关已被使用,并且会阻止打印其他行。

|

PIPE

s/%20/ /g

空格的子%20,g表示全局,所以对于该行的每个匹配都这样做

HTH:)

答案 1 :(得分:0)

这不是由任何模式执行的。我最好的猜测是,这个转义是由shell执行的,或者是什么获取HTML。

我会尝试一次解释一下这些模式

sed -n

-n指定sed在应用命令后不应打印出要匹配的文本,即html。
以下命令的形式为' s / regexp / replacement / flags'

^.*com_tex=\([^&]*\).*$

^匹配行的开头
。*匹配任何字符的零到多个
com_tex =字面匹配字符 \([^&] * \)' \('指定一个组的开头,以后可以通过其索引进行反向引用。' [^&] *'匹配零到多个字符不是''' \)'指定组的结尾 。*见上文
$匹配行尾

\1

上述替换是对正则表达式中第一个(也是唯一一个)组的反向引用,即' [^&] *'。因此,替换后会立即将所有字符替换为' com_tex ='直到第一个''

p标志指定如果发生替换,则应打印当前行替换。

sed "s/%20/ /g"

上面的内容要简单得多,它取代了所有(不仅仅是第一次)出现的'%20'有空间' '