Linux sed - 需要帮助弄清楚为什么模式匹配不起作用

时间:2012-01-29 11:43:49

标签: regex linux string sed grep

以下sed行适用于以下字符串。我的目标是将存储在值内的数据转换为变量。

<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" />

3 个答案:

答案 0 :(得分:2)

一些迂腐的笔记。不需要三sed次幂,你可以通过grep获得你想要的东西,并且可以看到正面表达式的前瞻和后视。

$> 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

答案 1 :(得分:0)

它在我的系统上工作正常,但你可能会逃脱:

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命令中经常发现的曲折,例如\/\/\/\/\/

此外,您只需要调用{em>一个的sed副本,并在每一行上运行多个命令。

第二个命令应足以剥离超出值的所有内容,尤其是在更复杂的内容中:

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

如果您希望使用sed等文本处理工具来处理XML,那就是这样。使用适当的工具有更多“可靠”的方法,但我假设你可以控制你的XML格式到sed可以处理它。

答案 2 :(得分:0)

这可能对您有用:

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 <<<$a
    • 将整个输入字符串替换为后引用\1,其中包含值value
    • 的双引号之间的所有内容