【问题标题】:What does the following SED pattern exactly do?下面的 SED 模式究竟做了什么?
【发布时间】:2015-07-08 07:48:10
【问题描述】:

我正在编写 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 替换。

但我就是想不通上面的模式是如何指定的!有人能告诉我该模式是如何工作的,或者我应该在那里替换什么模式,以便我得到我输入的命令而不是我得到的输出?

【问题讨论】:

  • 您的条目在 sed 替换中没有发生任何事情,因为没有模式匹配。所以它处于过程的早期阶段。顺便说一句,您可以通过将 ' |sed" 替换为 ; 并将最后一个双引号替换为单引号来避免 seconf sed。

标签: regex bash sed pattern-matching cgi


【解决方案1】:

这不是由任何模式执行的。我最好的猜测是这种转义是由 shell 或任何获取 HTML 的东西执行的。

我将尝试一次解释一些模式

sed -n

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

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

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

\1

上述替换是对正则表达式中第一个(也是唯一一个)组的反向引用,即“[^&]*”。所以替换用紧跟在 'com_tex=' 之后直到第一个 '&' 的所有字符替换整行。

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

sed "s/%20/ /g"

上面的内容要简单得多,它将所有(不仅仅是第一次)出现的 '%20' 替换为空格' '。

【讨论】:

    【解决方案2】:
     sed -n
    

    -n 开关表示“不打印”

    's/
    

    s 用于替换,/ 是分隔符,因此命令类似于
    s/Thing to sub/subsitution/optional extra command

    ^.*com_tex=
    

    ^ 表示行首
    .* 表示匹配0个或多个任意字符
    所以它将匹配从行首到com_tex=的最长字符串

    \(\)
    

    这是一个捕获组,这些括号内匹配的内容都会被保存,以后可以使用

    [^&]*
    

    [^]在方括号内使用帽子表示不匹配括号内的任何字符
    *与之前相同表示0或多个匹配

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

     .*$
    

    除了$之外,与第一位相同,表示行尾,所以这匹配所有内容,直到结束

    /\1/p' 
    

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

    |
    

    管道

    s/%20/ /g
    

    Sub %20 表示空格,g 表示全局,因此对行上的每个匹配项都这样做

    HTH :)

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 2012-07-23
      • 2016-09-10
      • 2023-03-15
      • 2012-10-17
      • 2021-06-04
      • 1970-01-01
      • 2018-07-30
      • 2019-10-06
      相关资源
      最近更新 更多