2012-10-03 25 views
3

我在Perl腳本中調用perl單行程。Perl單行程從文件中刪除尾隨空間

單線程的目的是從文件中刪除尾部空格。

裏面的主要Perl腳本:

`perl -pi -e 's/\s+$//' tape.txt`; 

現在它扔我一個錯誤Substitution replacement not terminated at -e line 2.

它在哪裏的問題呢?

+2

這將是一個更好的設計不這樣做。爲什麼不在腳本中做你需要做的事情,而不是從外部調用另一個Perl實例? – dan1111

+0

@ dan1111下面是情況 - 有一個外部程序在我的腳本讀取文件之前使用輸入文件。現在這個外部程序由於文件尾部空間而失敗。 所以我想1)刪除尾部空間2)將更新後的文件傳遞給外部程序3)從程序中獲取確認4)開始用腳本 –

+1

中的文件做東西如果做這樣的事情,總是要確保你的命令看起來像你認爲它:我的$ cmd =「perl -pi ...」;警告「cmd:'$ cmd'」; '$ cmd' – tinita

回答

4

倒引號語法調用一個外殼和調用時,外殼就認爲它應該插值傳遞的字符串。

一個更清晰的語法可能是:

system('perl -pli -e "s/\s*$//" tape.txt'); 

既然你沒有捕捉命令的輸出,以代替system使用反引號或qx是不是一個問題。

太,加-l開關autochomps每行讀取然後添加一個換行符---可能是你想要的。

+0

謝謝@JRFerguson –

7

這是因爲您的主perl腳本中的$/(特殊變量)。請注意,變量在``字符串內插入,就像""字符串內部一樣,並且其中存在一些單引號的事實不會改變該字符串。你需要逃脫$

`perl -pi -e 's/\s+\$//' tape.txt;` 
+0

試過這個,但是它不能代替尾隨空格 –

+1

你也需要轉義\。如果你打開了警告,你會看到:'無法識別的轉義'通過' – tinita

+0

'$ cmd =「perl -pi -e's/\\ s * \ $ //'tape.txt」;' '系統($ cmd);' 現在它替換\ n字符也 @tinita現在在哪裏破? –

0

\ s匹配[\ t \ n \ r \ f]並且不想匹配\ n。對於SUBST分隔符

注意使用{}:

$ echo -e 'hi \nbye'| perl -pe 's{[\t\040]+$}{};' | cat -A 
hi$ 
bye$