csplit命令中正则表达式中的多个分隔符

时间:2011-08-19 19:36:28

标签: regex unix split

我正在尝试使用csplit命令将文件拆分为3个字符串分隔符,但我遇到了问题。我没有得到cplist来处理分隔符列表。 这是我正在尝试的:

我有这个文件:

 TRANSHEADER002_XA
 XAL1
 XAL2
 XAL3
 TRANSHEADER001_EXEC
 EXECL1
 EXECL2
 EXECL3
 TRANSHEADER003_YB
 YBL1
 YBL2
 YBL3
 TRANSHEADER002_XA
 XAL1A
 XAL2A
 XAL3A

这些是字符串分隔符

 TRANSHEADER002_XA
 TRANSHEADER001_EXEC
 TRANSHEADER003_YB

但是当我尝试使用带有多于1个分隔符的csplit命令时,我没有成功,如下所示

 csplit -k -s -f "$file"_split. "$file" "/^\(TRANSHEADER002_XA\|TRANSHEADER001_EXEC\|TRANSHEADER003_YB\)/" "{999}"
 csplit -k -s -f "$file"_split. "$file" "/^(TRANSHEADER002_XA|TRANSHEADER001_EXEC|TRANSHEADER003_YB)/" "{999}"
 csplit -k -s -f "$file"_split. "$file" "/^TRANSHEADER002_XA|^TRANSHEADER001_EXEC|^TRANSHEADER003_YB/" "{999}"

对于上面的任何命令,我得到了如下所示的“超出范围”错误

 /^\(TRANSHEADER002_XA\|TRANSHEADER001_EXEC\|TRANSHEADER003_YB\)/ - out of range

我想拆分该文件,如下所示

 --> file_split.01
 TRANSHEADER002_XA
 XAL1
 XAL2
 XAL3

 --> file_split.02
 TRANSHEADER001_EXEC
 EXECL1
 EXECL2
 EXECL3

 --> file_split.03
 TRANSHEADER003_YB
 YBL1
 YBL2
 YBL3

 --> file_split.04
 TRANSHEADER002_XA
 XAL1A
 XAL2A
 XAL3A

你们是否知道如何通过使用csplit或使用另一个命令来解决我上面展示的分割文件?

非常感谢!

2 个答案:

答案 0 :(得分:0)

你不应该重复这种模式999次,而是使用一个可以根据需要重复多次的选项:{*}

csplit -kszf "$file"_split. "$file" "/^TRANSHEADER002_XA\|TRANSHEADER001_EXEC\|TRANSHEADER003_YB/" "{*}"

还可以使用-z选项删除空输出文件。

答案 1 :(得分:0)

使用您的示例文件,这对我有用:

csplit -zksf file_split. csplit.test.txt '/^TRANSHEADER\(002_XA\|001_EXEC\|003_YB\)/' '{*}'

使用{*}消除了超出范围的错误,因为它尽可能多地匹配,而不是完全尝试999次。

我也减少了你的正则表达式,但这不是重点。

(我看到Michal打败了我)