【发布时间】:2013-10-09 09:39:43
【问题描述】:
我正在寻找一个sed 命令来将保持空间的内容与模式空间相匹配。例如,假设假设的{h} 标记指的是保持空间的内容:
echo "foo: one foo three" | sed -n \
-e 'h; s/^\(.*\):.*$/\1/' \
-e 'x; s/.*: \(.*\)$/\1/' \
-e '/{h}/ p'
第一个-e 将整个echo 放入保持空间,然后将模式空间减少到仅初始的“foo”。第二个-e 将“foo”交换到保留空间中,并将原始echo 减少为尾随的“one foo 3”。第三个(假设的)-e 尝试将保持空间“foo”与模式空间“one foo three”进行匹配。当然没有{h}这样的标记,但如果有,模式空间会匹配,输出会是:
one foo three
sed 是否提供任何方法来做到这一点?
我的目标是在一个大文件 (4MB) 中计算所有此类匹配项。也可以使用while read 循环来完成,但它需要每行至少启动 3 个子进程,结果证明这非常慢!如果sed 不这样做,欢迎提出任何建议。
【问题讨论】:
-
如果我理解正确:你想比较冒号前面的单词是否是冒号后面的单词之一吗?而如果匹配打印冒号后面的所有字符,如果不匹配跳行,是这样的吗?
-
是的,就是这样。 Jotne 的回答可以解决问题。
-
我问它是因为使用反向引用 (
\1) 而不是hold space也很容易使用sed来做到这一点。 -
怎么样?当我尝试在匹配表达式中引用前一个表达式的捕获时,我收到了
Invalid back reference。 -
我添加了
sed命令作为答案。
标签: recursion sed pattern-matching