2013-08-30 40 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

相关问题