2013-08-30 105 views
0

我試圖從遠程計算機上的xml文件中獲取版本號。我通過Net :: SSH :: Perl cmd函數執行此操作。它看起來是這樣的:

my ($version, $err, $exit) = $ssh->cmd("head -11 /some/path/to/the/file.xml | tail -1 | sed 's/<[^>]\+>//g' | xargs"); 
print Dumper $version; 

我試圖實現與也就是說,提取數出XML標籤<version>2.6</version>

這工作完全正常,當我使用的CMD通過膩子SSH殼

[email protected]:~>head -11 /some/path/to/the/file.xml | tail -1 | sed 's/<[^>]\+>//g' | xargs 
2.6 
[email protected]:~> 

然而,Perl的打印

$VAR1 = '<version>2.6</version> 
'; 

任何想法爲什麼它不起作用?

編輯:很明顯,這無關淨:: SSH :: Perl的模塊,因爲

perl -e "system(\"head -11 /some/path/to/the/file.xml | tail -1 | sed 's/<[^>]\+>//g' | xargs\");" 

<version>2.6</version>

+0

你的命令行看起來太複雜。我假設簡化它也會解決這個問題。任何特定的原因,你不只是複製文件,並在Perl中處理它?或者試試'sed'1,10d; s/<[^>] *> // g:q'/ some/path/to/the/file.xml' – tripleee

+0

特別是尾隨的'xargs'是什麼?你想用這個來完成什麼?' – tripleee

+0

@tripleee最後的xargs用於從輸出中截斷不需要的空格/製表符/換行符。 'echo「abc」| xargs'將打印'abc'而不是'\ \ \ abc \ \ \'。 – Vince

回答

3

您正在使用雙引號同時打印。在雙引號中,\是特殊的,因此只有+而不是\+傳遞給sed

可以使用q()操作,以避免backslashing反斜線:

$ssh->cmd(q(head -11 /some/path/to/the/file.xml | tail -1 | sed 's/<[^>]\+>//g' | xargs)); 
+0

你是對的。我完全忘記了雙引號。拿我的+1並接受:) – Vince

相關問題