我很难弄清楚如何表达这个,所以 Google-fu 失败了。
我有一个带有数据表的文本文件。我想插入换行符以在视觉上分隔子组。
例如,如果我开始:
jan ford
jan trillian
mar trillian
sep marvin
Run Code Online (Sandbox Code Playgroud)
第一个字段是我的子组字段,那么输出应该是:
jan ford
jan trillian
mar trillian
sep marvin
Run Code Online (Sandbox Code Playgroud)
我可以做一些事情,比如^(a-z){3}\t(.*)\n\1\t(.*)$
确定月份相同的两条线,但我不知道当它们不同时如何匹配。
理想情况下,我希望这是一个我可以投入 BBedit 的正则表达式,但我对其他解决方案持开放态度。
它看起来像是bbedit
某种付费的 OSX 编辑器。恐怕我从未使用过它,也无法安装它,所以我无法在那里为您提供帮助。根据您显示的正则表达式,它有自己的正则表达式语法,因此您不太可能在使用它的通用 *nix 站点上找到解决方案。但是,这里有几个其他选项。在两者中,想法是保存第一个字段并打印一个空行,如果它与前一行中看到的不同:
$ awk '{if($1!=last && NR>1){print ""}last=$1;}1;' file
jan ford
jan trillian
mar trillian
sep marvin
Run Code Online (Sandbox Code Playgroud)
awk
是一种脚本语言,旨在处理基于字段的数据。它将自动将每一行拆分为字段,然后可以将其称为$1
, $2
... $N
。因此,上面的脚本将保存变量中的第一个字段last
,对于除第一行以外的每一行(这就是NR>1
意思),如果last
与当前保存的值不同,它将打印一个空行。该1;
是AWK简写“打印每一行”。
或者,您也可以在perl
:
$ perl -lape '$F[0] ne $last && $.>1 && print ""; $last=$F[0]' file
jan ford
jan trillian
mar trillian
sep marvin
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用perl
命令行开关来完成大部分工作。该-a
品牌perl
像awk
和每个输入行分割成阵列@F
。因此,$F[0]
是第一个字段。该-l
品牌perl
一个新行添加到每个print
调用,因此print ""
只是打印一个空行。这-p
使它在应用由-e
. 脚本本身与awk
上面的完全相同。