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

Perl命令行-如果找到字符串,则替换下一行,perl,Perl,我是一个十足的Perl noob,正在努力弄清楚这件事是否可以做到。我有一个文本文件,其中包含公式名称等数据,然后下一行(单行)中的公式如下- Formula Name = abc formula for TAT count(a)+500 公式名称是唯一的。我需要搜索公式名称,然后替换下一行中的公式。最好的方法是什么?可以用perl命令行完成吗 似乎命令行一次读取一行文件,我需要使用-0NNN开关才能在多行上操作。但我不知道如何使用这个 提前谢谢 我认为在这种情况下可以使用perl。但现在我知

我是一个十足的Perl noob,正在努力弄清楚这件事是否可以做到。我有一个文本文件,其中包含公式名称等数据,然后下一行(单行)中的公式如下-

Formula Name = abc formula for TAT
count(a)+500
公式名称是唯一的。我需要搜索公式名称,然后替换下一行中的公式。最好的方法是什么?可以用perl命令行完成吗

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

提前谢谢


我认为在这种情况下可以使用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中实现这一点,我们还需要几行代码,我将尝试一些示例,稍后在这里编写

编辑:


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

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

您不需要使用
-0777
选项,只需读取并扔掉一行,然后向当前行添加您想要的内容

perl -pe 'if (/Formula Name/) { <>; $_ .= "new formula$/"; }' filename
perl-pe'if(/Formula Name/){;$\u.=“new Formula$/”;}”文件名

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

bash
语法:

perl -i.vixmp -pe'
    s/\Q$name\E/\U$name/ if $name;
    ($name) = /Formula Name = (\S+)/;
' file
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
perl -i.vixmp -pe"
    s/\Q$name\E/\U$name/ if $name;
    ($name) = /Formula Name = (\S+)/;
" file
您没有确切指定需要替换的内容,以及需要替换的内容,因此将公式名称替换为大写。根据需要进行调整

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


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

谢谢!但是很遗憾,我需要一个perl解决方案。我尝试了perl-ne“s/*/e=mc2/if$find;print;$find=/Formula Name/;”test.txt,但它最终打印了文件,而没有修改它:(有趣的是,我尝试了perl.exe-pi-I.vxtmp-e“s/*/e=mc2/if$find;print;$find=/Formula Name/;”test.txt它可以工作,但最终会复制文件中的每一行!有没有办法解决这个问题?你能给出一个替换的例子吗?任何一行…比如count(b)+600我尝试了这个perl-pi-i.vixmp-e“if(/Formula Name/){;$\u=“new Formula\n”;}”test.txt,但它给出了以下错误-语法错误在-e行1,靠近“}continue”在-e第1行缺少右花括号或方括号,在行尾执行-e由于编译错误而中止。@Jai如果您使用的是Windows,则需要对程序行加双引号,在这种情况下,您不能对新公式使用双引号。请使用
qq(新公式$/)
相反。您需要对
$/
\n
进行插值,因此
qq()
是必需的。这也很有效!谢谢!以前应该提到它是windows。