【问题标题】:Need a greedy address range in sed在 sed 中需要一个贪婪的地址范围
【发布时间】:2016-02-09 14:18:03
【问题描述】:


我有一个 bash 脚本,我正在使用 Vim。该脚本通过复制带有最终# }}} 的文件,然后在新的# }}} 后面附加新数据,在最终折叠结束之前将数据附加到文件中。下面这个 sn-p 可以更加优雅,我有一个贪婪的地址范围。

local END=$(grep -n '# }}}'  $FILENAME   | sed -n "$ s/\([[:digit:]]*\)\(.*\)/\1/p ")
let END=$END-1
sed -n "1, $END {p}" $FILENAME  > $TEMPFILE

理论上,如果 sed 支持“--greedy-address-range”标志,我可以使用:sed --silent --in-place --greedy-address-range "1, /# }}}/ {p}" $FILENAME

当然,提前感谢您的任何建议!

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 我一直在尝试将代码块放入评论中,但没有成功,然后文件答案相反,“哇,应该想到这个!”我忽略了 END 必须在我的理论解决方案中减去一行,但是相反的文件解决方案否定了对这种问题的需要,但是,从考虑哈希和花括号之间的空白以及使用锚点的经验来看东西更健壮一点!
  • 我不明白你是否最终喜欢我的解决方案。您是否仍然有兴趣找到一种使用行号的方法?
  • 对不起,是的,我喜欢你的解决方案。翻转文件是一种很好的方法,可以确保在最终折叠下没有任何东西。我考虑了一些并决定使用 Sed 不从翻转文件的顶部打印,直到第一个关闭 Vim 折叠标记 应该 比我原来的 3 行解决方案更容易在眼睛上......避风港'还没来得及测试呢。

标签: sed


【解决方案1】:

如果我很好地理解了您需要的输出,这也可以完成工作:

tac $FILENAME | sed -n '/# }}}/,$p' | tac > $FILENAME

为了打印所有行直到 last 匹配,我反转文件,然后使用 sed 打印从 first 匹配到 EOF 的所有行,然后再次反转它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2016-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多