使用 Perl Regex Multiline 重新格式化文件

发布于 2024-12-21 23:03:58 字数 423 浏览 0 评论 0 原文

我有以下格式的文件:

(类型 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' 

我的推理是将换行符替换为空格。 但它似乎不起作用。你能帮我吗?谢谢

I have the file with the following format:

(Type 1 data:1)
B
B
(Type 1 data:2)
B
B
B
(Type 1 data:3)
B
..

Now I want to reformat this file so that it looks like:

(Type 1 data:1) B B
(Type 1 data:2) B B B
(Type 1 data:3) B

...

My approach was to use perl regex in command line,

cat file | perl -pe 's/\n(B)/ $1/smg' 

My reasoning was to replace the new line character with space.
but it doesn't seem to work. can you please help me? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾`听者〃 2024-12-28 23:03:58

-p 一次读取一行,因此“\n”后面没有任何内容可以匹配。

perl -pe 'chomp; $_ = ($_ =~ /Type/) ? "\n".$_ : " ".$_'

这几乎完成了您想要的操作,但在开头添加了一个额外的换行符并丢失了最后的换行符。

The -p reads a line at a time, so there is nothing after the "\n" to match with.

perl -pe 'chomp; $_ = ($_ =~ /Type/) ? "\n".$_ : " ".$_'

this does almost what you want but puts one extra newline at the beginning and loses the final newline.

殊姿 2024-12-28 23:03:58

如果 ( 显示的唯一位置是您希望行开始的位置,那么您可以使用此命令。

perl -l -0x28 -ne's/\n/ /g;print"($_"if$_' < file
  • -l 导致 print 在打印的每行末尾添加 \n
  • 。 .org/perlrun.html#%2a-0%2a%5b_octal%2fhexadecimal_%5d" rel="nofollow">-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.

perl -l -0x28 -ne's/\n/ /g;print"($_"if$_' < file
  • -l causes print 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 adds while(<>){chomp $_; to the beginning, and } at the end of what ever is in -e.
  • s/\n/ /g
  • print "($_" if $_ The if $_ part just stops it from printing an extra line at the beginning.
你的往事 2024-12-28 23:03:58

它有点复杂,因为 -n-p 最适合一次处理一行,而您的要求是组合几行,这意味着您必须维持状态一段时间。

因此,只需读取内存中的整个文件并应用正则表达式,如下所示:

perl -lwe ^
"local $/; local $_ = <>; print join q( ), split /\n/ for m/^\(Type [^(]*/gsm"

使用输入重定向 (<) 将文件馈送到 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:

perl -lwe ^
"local $/; local $_ = <>; print join q( ), split /\n/ for m/^\(Type [^(]*/gsm"

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文