2012-05-11 105 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版本中刪除換行符,但它是可選的。