使用 Perl Regex Multiline 重新格式化文件
我有以下格式的文件:
(类型 1 数据:1)
B
B
(类型 1 数据:2)
B
B
B
(类型 1 数据:3)
B
..
现在我想重新格式化该文件,使其看起来像:
(类型 1 数据:1) B B
(类型 1 数据:2) BB B
(类型 1 数据:3)B
...
我的方法是在命令行中使用 perl 正则表达式,
cat file | perl -pe 's/\n(B)/ $1/smg'
我的推理是将换行符替换为空格。 但它似乎不起作用。你能帮我吗?谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
-p 一次读取一行,因此“\n”后面没有任何内容可以匹配。
这几乎完成了您想要的操作,但在开头添加了一个额外的换行符并丢失了最后的换行符。
The -p reads a line at a time, so there is nothing after the "\n" to match with.
this does almost what you want but puts one extra newline at the beginning and loses the final newline.
如果
(
显示的唯一位置是您希望行开始的位置,那么您可以使用此命令。-l
导致print
在打印的每行末尾添加\n
-0x28
导致它在(而不是
\n
while(<>){chomp $_;
和}
。 > 在一切的尽头-e
.s/\n/ /g
打印“($_” if $_
if $_
> 部分只是阻止它在开头打印额外的行。If the only place that
(
shows up is at the beginning of where you want your lines to start, then you could use this command.-l
causesprint
to add\n
on the end of each line it prints.-0x28
causes it to split on(
instead of on\n
.-n
causes it to loop on the input. Basically it addswhile(<>){chomp $_;
to the beginning, and}
at the end of what ever is in-e
.s/\n/ /g
print "($_" if $_
Theif $_
part just stops it from printing an extra line at the beginning.它有点复杂,因为
-n
和-p
最适合一次处理一行,而您的要求是组合几行,这意味着您必须维持状态一段时间。因此,只需读取内存中的整个文件并应用正则表达式,如下所示:
使用输入重定向 (
<
) 将文件馈送到 STDIN 上的此程序。请注意,此语法适用于 Windows 命令行。对于 Bash,使用单引号来引用脚本。
It's a little more involved as
-n
and-p
fit best for processing one line at a time while your requirement is to combine several lines, which means you'd have to maintain state for a while.So just read the entire file in memory and apply the regex like this:
Feed your file to this prog on STDIN using input redirection (
<
).Note this syntax is for the Windows command line. For Bash, use single quotes to quote the script.