gpt4 book ai didi

shell - 如何通过匹配行上下文来拆分文件?

转载 作者:行者123 更新时间:2023-12-04 16:18:00 24 4
gpt4 key购买 nike

我有一个文件,x,带有部分分隔符:

The first section

#!

The second section

#!

The third section

我想把它分成一系列单独的文件,比如:

The first section
#!

The second section
#!

The third section

我认为 csplit 会是解决方案,使用如下命令行:

$ csplit -sk x '/#!/' {9999}

但第二个文件 (xx01) 最终包含两个分隔符:

#!

The second section

#!

关于如何以符合 POSIX 的方式完成我想要的事情有什么想法吗? (是的,我可以接触到 Perl/Python/Ruby 和 friend ;但是,重点是扩展我的 shell 知识。)


我担心我在 OSX csplit 中发现了一个错误。人们可以试一试并让我知道结果吗?

#!/bin/sh

test -e

work="$(basename $0).$RANDOM"
mkdir $work

csplit -sk -f "$work/" - '/#/' '{9999}' <<EOF
First
#
Second
#
Third
EOF

if [ $(grep -c '#' $work/01) -eq 2 ]; then
echo FAIL Repeat
else
echo PASS Repeat
fi

rm $work/*

csplit -sk -f "$work/" - '/#/' '/#/' <<EOF
First
#
Second
#
Third
EOF

if [ $(grep -c '#' $work/01) -eq 2 ]; then
echo FAIL Exact
else
echo PASS Exact
fi

uname -a

当我在我的 Snow Leopard 盒子上运行它时,我得到:

$ ./csplit-test
csplit: #: no match
FAIL Repeat
PASS Exact
Darwin lani.bigpond 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug 9 20:54:00 PDT 2011; root:xnu-1699.24.8~1/RELEASE_X86_64 x86_64

在我的 Debian 机器上,我得到:

$ sh ./csplit-test 
csplit: `/#/': match not found on repetition 2
PASS Repeat
PASS Exact

最佳答案

这似乎对我在 LINUX 上有效:

csplit -sk filename '/#!/' {*}

给予:

$ more xx00
The first section

$ more xx01
#!

The second section

$ more xx02
#!

The third section

您还可以使用 Ruby 或 Perl 在一个小脚本中完成此操作,并一起摆脱分隔符


在 Fedora 13 Linux 上:

$ ./test.sh 
csplit: `/#/': match not found on repetition 2
PASS Repeat
PASS Exact
Linux localhost.localdomain 2.6.34.8-68.fc13.x86_64 #1 SMP Thu Feb 17 15:03:58 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

关于shell - 如何通过匹配行上下文来拆分文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8373793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com