2012-05-11 87 views
2

我是一个完全的Perl noob,并试图弄清楚这件事是否可以完成。我有像这样的文本文件包含了像公式名称的数据,然后在下一行(单线)的公式 -Perl命令行 - 如果找到字符串替换下一行

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

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

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

在此先感谢!

J

+0

你可以举一个替换的例子吗? – m0skit0

+0

任何行...说count(b)+ 600 – Jai

回答

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 
+0

谢谢!但是我需要一个perl解决方案。 – Jai

+0

好的,我找到了解决方案 –

+0

我试过perl -ne“s /.*/e = mc2/if $ find; print; $ find =/Formula Name /;” test.txt 但它最终打印该文件,而不是修改它:( – Jai

1

您可以用替换正则表达式做到这一点。您可以匹配对一个正规表示法文本的每一行,然后替换第二部分,只要你想,例如这样的事情应该工作:

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

你并不需要使用-0777选项,你可以只需阅读并扔掉一条线,然后将所需的任何内容添加到当前线。

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

我以前$/代表你换行,因为它应该是一样什么readline的使用。但你也可以使用\n。要进行就地编辑,只需添加-i.bak开关。

+0

我试过这个perl -pi -i.vixmp -e“if(/ Formula Name /){<>; $ _。=”new formula \ n“;}”test.txt,但它给了我下面的错误-syntax error -e line 1 ,“near continue” 在-e行1处缺少右卷曲或方括号,行尾 执行-e因编译错误而中止 – Jai

+1

@Jai如果您使用Windows,则需要双引号程序行,在这种情况下,您不能对新的for使用双引号穆拉。改用'qq(新公式$ /)'。 * *需要插入'$ /'和'\ n',所以'qq()'是必须的。 – TLP

+0

ack,缩回。 – ikegami

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版本中删除换行符,但它是可选的。