2013-06-21 78 views
2

當我在命令行中使用「sed」時,它正在工作,但沒有包含在perl腳本中。SED命令不能在perl腳本中工作

一個例子是SED的/ \ S + //克'AAA> BBB

但說當我試圖通過perl腳本

$gf = `sed 's/\s\+//g' aaa > bbb` ; 

輸出文件,以調用相同的命令與輸入文件一樣!請建議。

+1

你能給出一個完整的例子,包括變量'aaa'的perl腳本和值 - 它是如何進入的?你知道'\ s +'與'\ s \ +'不一樣,對吧? – Floris

+0

http://stackoverflow.com/questions/918128/how-can-i-do-bulk-search-and-replace-with-perl – ctn

+0

謝謝..我想下面給出的答案是我正在尋找。 – user2508758

回答

4

在Perl,反引號具有相同的逃生和插值規則雙引號的字符串:反斜槓形成一個未知的轉義碼忘記反斜槓,例如"\." eq "."

因此,Perl代碼

print `echo \"1\"`; 
print `echo \\"1\\"`; 

輸出

1 
"1" 

如果你想嵌入該sed命令轉換爲Perl,你有逃跑的反斜槓,這樣他們甚至達到sh ELL:

$gf = `sed 's/\\s\\+//g' aaa > bbb`; 

其實,你不會得到任何在將輸出重定向到文件時輸出到$gf。我們可以只是做

use autodie; 

system "sed 's/\\s\\+//g' aaa > bbb"; 

或用單引號:

use autodie; 

system q{ sed 's/\s\+//g' aaa > bbb }; 

這使反斜線。

不過,這是非常不必要的,因爲Perl可以應用替代本身。

use autodie; # automatic error handling 

open my $out, ">", "bbb"; 
open my $in, "<", "aaa"; 
while (<$in>) { 
    s/\s\+//g; # remove all spaces followed by a plus 
    print {$out} $_; 
} 
+0

非常感謝......我浪費了更多的時間在這個3小時,你已經在1分鐘內解決了這個問題。非常感謝 – user2508758

+1

您的意思是'sed sed'還是在拼寫錯誤?如果不是拼寫錯誤,你能解釋爲什麼兩個'sed'連續?除了那個非常好和清晰的解決方案! – Floris

+0

@弗洛里斯感謝您發現重複。 – amon

-2

有你在你的文件的頂部有

use strict; 
    use warnings; 

,你可以需要反引號執行命令

$gf = `sed 's/\s\+//g' aaa > bbb`; 
0

在這些奇怪的情況下,我確保我運行的是正確的命令。我會建造它,儲存,輸出的命令,所以我可以看到什麼我創建:

my $command = '....'; 
print "Command is [$command]\n"; 
my $output = `$command`; 

如果你正在運行在Perl sed,你可能會做它,因爲錯誤的Perl已經可以做所有那。