我正在研究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。
但我无法弄清楚如何在上面的模式中指定!有人请告诉我这种模式是如何工作的,或者我应该用什么样的模式代替,以便我得到输入的命令而不是我得到的输出?
答案 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'有空间' '