【问题标题】:How to implement sed range pattern command on groovy script如何在 groovy 脚本上实现 sed 范围模式命令
【发布时间】:2026-01-04 14:50:01
【问题描述】:

我正在努力在 groovy 脚本上实现 sed 范围模式命令。

这就是我尝试在 groovy 脚本中实现命令的方式:

 def range = sed -n -e /Word A/,/Word D/ p
 def result = cat sample.txt | range.execute()

这是 sample.txt 文件的内容:

Word A
Word B
Word C
Word D
Word E
Word F

这是我想要的输出:

Word A
Word B
Word C
Word D

现在,当我运行它时返回给我的错误是:

sed: unmatched '/'

我相信我收到此错误的原因是因为在实际的 sed 命令中,我需要以某种方式将范围模式完全分组,因为我觉得并且实际上我已经测试过了,sed 命令仅适用于第一个范围,即“WORD A”,然后它将下一个“/”读取为文字字符,而不是封装下一个模式的字符,即 WORD D。

我尝试使用单引号和双引号,但是在运行我的脚本时,我收到一条错误消息:sed unmatched "'" or sed unknown command。

最终,我需要以某种方式在 groovy 脚本中说出以下内容:

sed -n -e (/Word A/,/Word D/ p)

有人可以帮忙解决这个问题吗,因为我花了两天时间才解决这个问题。

谢谢!

【问题讨论】:

  • 您是否只是想产生"Word" 后跟一个范围内的字母?
  • @ernest_k,我不太清楚你的意思。我想返回单词 A 和单词 D 之间的单词列表
  • 好吧,如果你只想生成它,那么你可以使用('A'..'D').collect{"Word $it"}.join("\n"),然后将结果保存到文件中......
  • 是收集java方法吗? $it 是什么?

标签: groovy sed


【解决方案1】:

你可以按照这些思路使用一些东西:

def isBlockStart =  { "Word A".equals(it) }
def isBlockEnd = { "Word D".equals(it) }

def isInsideBlock = false;    

inputText.eachLine {
    if (!isInsideBlock && isBlockStart(it)) { isInsideBlock = true }
    if (isInsideBlock) println(it)
    if (isInsideBlock && isBlockEnd(it)) { isInsideBlock = false }
}

你可以try it here

请注意,我没有太多使用 Groovy 的经验,我敢肯定我错过了很多 groovyism,它们会使代码更短/更容易被有更多 Groovy 经验的人理解。但它确实有效,而且我认为你不能做得更有效率。

【讨论】: