Perl命令行 - 如果找到字符串替换下一行

时间:2012-05-11 18:41:47

标签: perl

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

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

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

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

提前致谢!

Ĵ

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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

答案 2 :(得分: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版本中删除换行符,但它是可选的。

答案 3 :(得分:1)

您可以使用替换正则表达式来执行此操作。您可以将文本的每一行与常规表达相匹配,然后根据需要替换第二部分,例如,这样的内容应该有效:

$repl = "replacement formula for the line";
$line =~ s/(Formula Name\s=\s)([\w]\d]+)$/$1 $repl/;