1

我是 Unix 实用程序的新手,但尝试学习新东西并尝试将我的简单 ruby​​ 脚本切换到某种 shell 脚本做同样的事情。但我不知道如何处理这项任务。

我需要拆分一个包含几个小对象的大文件。每个对象都以如下行开头:OBJECT Type Number Name.

当我使用 Ruby 时,我正在遍历文件行,如果我找到了模式,我开始将行转储到文件中。直到我再次找到这种模式。

完成后,我将收到一堆较小的文件,而不是一个大文件。

但是是否可以使用 shell 脚本和 Unix 实用程序来做同样的事情?grep, sed... 无需调用perl, ruby?

编辑:我正在尝试开发自定义git命令并使用 Windows。所以只有 msysgit 附带的实用程序可供我使用。

创建的对象的文件名模式如下Type-Number.txt

更新:感谢@perreal,我提出了以下代码,它可以满足我的要求。希望其他使用 git 的 Dynmaics NAV 开发人员会发现这git object splitter很有用:

#!/bin/sh
#
# Splits text file with multiple Dynamics NAV object into many files, one per object.
# If no input file name is given, default name (all.txt) will be used instead.
#

if [ -n "$1" ] 
then
    ALL="$1"
else
    ALL="all.txt"
fi

awk '{
    if (/^(OBJECT ).*/) {
        file = toupper(substr($2,1,3))$3".TXT"
        print > file 
    } else {
        print >> file 
    }
}' "$ALL"
4

2 回答 2

4
awk '{ 
  if (/(OBJECT.*)/) {
    file = OBJECT$2$3$4
    print > file
  } else {
    print >> file
  }
}' input_file
于 2012-07-18T17:00:04.220 回答
2

我认为您正在寻找“上下文拆分”命令: csplit

$ csplit filename '/OBJECT/'
于 2012-07-18T15:19:48.020 回答