【问题标题】:Extracting multiple instances of a regex pattern from file using KornShell使用 KornShell 从文件中提取正则表达式模式的多个实例
【发布时间】:2013-12-18 21:48:54
【问题描述】:

我有一个文件可能有多个字符串模式实例(以 X 开头,以 Y 结尾)。我想提取与此模式匹配的每个实例。这些可能在单行上,或者新行可能在也可能不在行的开头或结尾。我曾尝试使用带有正则表达式模式 (X.*Y) 的 grep,但运行 ksh 的 KornShell (ksh) 版本无法识别 -c 选项,因此很难提取我需要的内容。我还读到 awk 可以做到这一点,但没有为 awk 找到好的文档。

任何帮助将不胜感激。

【问题讨论】:

  • “提取”是什么意思? -c 选项与您的问题有什么关系?
  • 请提供您的示例文件和预期输出,这有助于更好地了解您的需求,谢谢。
  • 如果您使用 Korn shell,正如您的主题行所建议的那样,您应该用 ksh 标记这个问题,而不是 bash。跨度>
  • 你想如何处理例如XabcYdefXghiY 还是 XabcXdefYghiY?是每一个匹配,还是两个(或更多)匹配?可以嵌套匹配,还是只查找内部/外部/第一个/最后一个/最大/最小匹配?
  • @ruifeng - 我目前无法提供示例文件,只是知道我正在文件中搜索模式并希望将与模式匹配的实例放入变量中以供以后使用.

标签: regex shell scripting awk ksh


【解决方案1】:

如果模式包含在一行中,并且每行只有一个实例,您可以尝试

awk -f ext.awk file

file 是您的输入文件,ext.awk

BEGIN {
    pat="X.*Y"
}
$0 ~ pat {
    match ($0,"(" pat ")",a)
    print a[1]
}

更新

如果在一行中可以找到多个模式,或者模式跨越多行,您可以将ext.awk 替换为:

{
    line=line $0 RS
}
END {
    while(match(line,/(X[^Y]*Y)/,a)) {
        print a[1]
        line=substr(line,RSTART+RLENGTH)
    }
}

【讨论】:

  • 模式可能包含在多行中,也可能包含多个实例
  • 稍后我会试试这个并告诉你。感谢您的建议。
  • 所以这几乎可以工作。 RegEx 不太正确,我正在尝试弄清楚,但由于某种原因似乎对我不起作用。我希望每次出现 X...Y。所以 XabcdYzzzXddddYXhhhhY 应该返回 XabcdY 和 XddddY 和 XhhhhY 但 RegEx 变得贪婪并给我 XabcdYzzzXddddYXhhhhY。我试过 X.*?Y 和 X(.*?)Y 但它们似乎对我不起作用。关于正则表达式的任何建议?
  • 在每个 X 和 Y 之间添加这个可能会有一个特殊字符,例如 X*abc*1YXabacY
  • 它适用于我使用X[^Y]*Y 作为正则表达式。我得到XabcdYXddddYXhhhhY..
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多