3

我是一个完全 Perl 的菜鸟,并试图弄清楚这件事是否可以完成。我有一个文本文件,其中包含公式名称等数据,然后是下一行(单行)中的公式,如下所示 -

Formula Name = abc formula for TAT
count(a)+500

公式名称是唯一的。我需要搜索公式名称,然后在下一行替换公式。做这个的最好方式是什么?可以用perl命令行完成吗?

似乎命令行一次读取一行文件,我需要使用-0NNN开关才能在多行上进行操作。但我不确定如何使用它。

提前致谢!

Ĵ

4

4 回答 4

4

您不需要使用该-0777选项,您可以简单地阅读并丢弃一行,然后将您想要的任何内容添加到当前行。

perl -pe 'if (/Formula Name/) { <>; $_ .= "new formula$/"; }' filename

我曾经$/代表您的换行符,因为它应该与 readline 使用的相同。但你也可以使用\n。要进行就地编辑,只需添加-i.bak开关。

于 2012-05-11T18:57:54.320 回答
2

我认为在这种情况下可以使用 perl。但现在我知道一种在 SED 中解决的方法。它有助于?

$ cat xxx
Formula Name blablabla
cos(x) + i sen(x)

other stuff
$ sed '/Formula Name/{n;s/.*/e=mc2/;}' xxx
Formula Name blablabla
e=mc2

other stuff

要在 perl 中做到这一点,我们需要多几行,我会尝试一些示例,稍后再写在这里。

编辑:

$ perl -ne 's/.*/e=mc2/ if $find; print; $find=/Formula Name/;' xxx
Formula Name blablabla
e=mc2

other stuff
于 2012-05-11T18:48:53.140 回答
2

bash句法:

perl -i.vixmp -pe'
    s/\Q$name\E/\U$name/ if $name;
    ($name) = /Formula Name = (\S+)/;
' file

cmd句法:

perl -i.vixmp -pe"
    s/\Q$name\E/\U$name/ if $name;
    ($name) = /Formula Name = (\S+)/;
" file

您没有准确指定需要替换的内容以及需要替换的内容,因此将公式名称替换为大写。根据需要进行调整。

如果您要查找特定公式而不是所有公式,只需更改\S+您要查找的公式的名称即可。

重要提示:您必须从版本中删除换行符cmd才能使其正常工作。(我使用它们是为了便于阅读。)您可以从版本中删除换行符bash,但它是可选的。

于 2012-05-11T19:19:37.570 回答
1

您可以使用替换正则表达式来做到这一点。您可以将文本的每一行与正则表达式匹配,然后根据需要替换第二部分,例如这样的东西应该可以工作:

$repl = "replacement formula for the line";
$line =~ s/(Formula Name\s=\s)([\w]\d]+)$/$1 $repl/;
于 2012-05-11T18:53:24.377 回答