【问题标题】:Linux sed - Need help figuring out why pattern matching isn't workingLinux sed - 需要帮助找出模式匹配不起作用的原因
【发布时间】:2012-01-29 11:43:48
【问题描述】:

以下sed 行适用于以下字符串。我的目标是将存储在 value 中的数据放入一个变量中。

<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />

| sed 's/^.* value="//' \
| sed 's/ \/>//' \
| sed 's/"//'

但我真的认为最后一行是浪费。我不明白为什么当我尝试在如下所示的单行上执行此操作时,它不正确匹配。

| sed 's/" \/>//'

第一个 sed 行字符串处于以下状态后仅供参考

483deac360aa1d0ea89cedbdcc4d051e" />

【问题讨论】:

  • echo '&lt;input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" /&gt;' | sed 's/^.* value="//' | sed 's/" \/&gt;//' 在这里工作正常...
  • 为我工作,您确定按此处所示输入吗?
  • 绝对是,我从 shell 脚本中复制了这个。我正在使用 BASH,但我并不是一个脚本大师。 :)
  • 注意"' 符号。 Echo 命令可以压制它,看起来有些突兀。

标签: regex linux string sed grep


【解决方案1】:

一些迂腐的注释。不需要三重sed 幂,您可以使用grep 和lookahead 和lookbehind 正则表达式获得您想要的。

$> cat ./text 
<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />

$> grep -P -o "(?<=value=\")([a-f0-9]*)(?=\")" ./text 
0f5ae5a6e8bb84d3e18b30b7ff2a46b2

【讨论】:

    【解决方案2】:

    它在我的系统上运行良好,但你可能会逃脱:

    sed -e 's?^.* value="??' -e 's?".*$??'
    

    如本成绩单所示:

    pax> echo '<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />' | sed -e 's?^.* value="??' -e 's?".*$??'
    0f5ae5a6e8bb84d3e18b30b7ff2a46b2
    

    GNU sed 可以使用其他分隔符,这可以最大限度地减少您在sed 命令中经常发现的曲折,例如\/\/\/\/\/

    此外,您只需要调用 一个 sed 的副本,并在每一行上给它多个命令即可运行。

    第二个命令应该足以删除所有超出值的内容,尤其是在更复杂的命令中,例如:

    <input type="hidden" name="xyzzy" value="plugh" something="else" />
    

    如果你想要使用像sed 这样的文本处理工具来处理XML。使用适当的工具有更多“可靠”的方法可以做到这一点,但我假设您可以将 XML 格式控制在sed 可以处理的程度。

    【讨论】:

      【解决方案3】:

      这可能对你有用:

      a='<input type="hidden" name="form_token" id="edit-system-site-maintenance-settings-form-token" value="0f5ae5a6e8bb84d3e18b30b7ff2a46b2" />'
      b=$(sed 's/.*value="\("[^"]*\).*/\1/' <<<$a)
      echo $b
      0f5ae5a6e8bb84d3e18b30b7ff2a46b2
      

      解释:

      • 将输入字符串保存到变量a
      • 将命令替换的结果赋值给变量b
        • 使用 here-string 将输入字符串传递给 sed &lt;&lt;&lt;$a
        • 将整个输入字符串替换为后向引用\1,其中包含值value 的双引号之间的所有内容

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多