我做下一个使用awk:匹配的字符串被解析使用awk
awk '/secon/ {print $1}' vladtest.sh |cut -c2-6
如何此字符串在Perl循环匹配合适的方式:
my $var1= `awk '/secon/ {print $1}' vladtest.sh |cut -c2-6`
if ($var1 eq "secon"){
print "OK";
} else {
print "FALSE"
}
我做下一个使用awk:匹配的字符串被解析使用awk
awk '/secon/ {print $1}' vladtest.sh |cut -c2-6
如何此字符串在Perl循环匹配合适的方式:
my $var1= `awk '/secon/ {print $1}' vladtest.sh |cut -c2-6`
if ($var1 eq "secon"){
print "OK";
} else {
print "FALSE"
}
首先,你的问题是```包含换行符的结果。所以$var1
不是"secon"
,而是"secon\n"
。您可以处理任何数量的方式 - 包装chomp(
... )
整个分配各地$var1
,或改变eq
的右侧包括"\n"
,或使用正则表达式来代替:带或不带chomp
if ($var1 =~ /^secon$/)
作品,因为$
匹配字符串最终换行符(如果存在)。
所有第二,你用大约两个节目太多了这里:
my $var1= `awk '/secon/ {print $1}' vladtest.sh |cut -c2-6`
我的意思是,awk
可以做任何事情cut
可以做的,perl
可以做任何事情,无论是可以做到的。当我在shell提示符下输入one-liners时,我很喜欢awk
和cut
,只是为了他们的表达经济;在他们各自的专业领域内,他们的命令行通常比相应的命令行短(甚至使用perl -a
等)。但是因为你已经在Perl程序中了,所以没有理由在这里找到别的东西。
下面是上面的例子直接替代:
my $var1;
{
open(my $fh, '<', 'vladtest.sh');
while (<$fh>) {
$var1 .= substr(split(' ')[0],1,5)."\n" if /secon/;
}
}
但你并不需要经过所有,如果你只是想检测,如果有一个匹配。
{open(my $fh, '<', 'vladtest.sh');
print 'NOT ' unless grep { /^\s*\Ssecon/ } <$fh>;
say 'OK';} # or print "OK\n"; if you don't have 5.10 extensions enabled.
你可以跳过'open'并使用_null文件handle_(aka Diamond操作符)。 'print'不是'grep {/^\ s * \ Ssecon /} <>;'这会将命令行或STDIN提供的文件(就像其他的Unix命令一样)。 –
当然,但是假定文件'vladtest.sh'作为Perl程序的命令行参数提供,并且它没有使用其命令行参数来处理其他事情。 –
我的awk的有点生疏,但是你抓住1美元,然后寻找2到6的字符来匹配'secon'。如果有任何行匹配,则打印“OK”,否则“NOT OK”。这里有一个Perl的唯一的解决办法:
use 5.10.0;
while (<>) {
if (/^\s*\Ssecon/) {
say 'OK';
exit 0;
}
}
say 'NOT OK';
exit 1;
的正则表达式是由:
^ match the start of each line, followed by
\s* zero or more whitespace characters, followed by
\S one non-whitespace character, followed by
secon the literal string that you're interested in
只要我们有一个匹配行,我们可以打印“OK”退出。否则,我们将在循环结束时打印“NOT OK”。
use 5.10.0;
行是需要的,所以你可以使用say()
。
还有为落实这一要求,但按照你的想法目前,改变第一行来解决问题更好的方法。
my $var1= `awk '$1~/secon/ {print substr($1,2,5)}' vladtest.sh`
用'awk'内建替换'cut',但不能解决问题 - '$ var1'仍然是''secon \ n“',而不是'eq”secon“'。 –
这是perl脚本,那么请求者应该知道如何删除\ n,然后通过chomp – BMW
进行比较,但由于这是他们询问的整个问题,所以他们显然不会。我们不会根据他们不知道的内容来批评提问者。“ –
添加“use sctrict;”和“使用警告”;在你的perl脚本中。看起来你根本没有声明变量$ var1。 – alex
我很抱歉,刚刚没有复制好,我编辑问题 – klerk
然后,“secon”可以只是这个词的一部分。在Perl中使用$ var1 =〜/ secon /而不是eq。 – alex