我需要在用户更改源文件时对源文件中的某些模式进行大量搜索,因此我需要进行时间和内存高效的正则表达式匹配.模式重复,所以应该编译一次,但我需要能够检索子部分(而不是只是确认一个匹配)
我正在考虑使用java.util.regexp或Jakarta perl5util(如果它仍然存在,我使用它已经过了几年),或者可能是Eclipse搜索引擎,虽然我怀疑它更聪明.
这两者之间是否存在显着的性能差异?
我正在尝试做类似以下的事情:
for file in `find . *.foo`
do
somecommand $file
done
Run Code Online (Sandbox Code Playgroud)
但命令不起作用,因为$ file非常奇怪.因为我的目录树有蹩脚的文件名(包括空格),我需要转义find命令.但是没有明显的转义似乎有效:
-ls给我空格分隔的文件名片段
-fprint没有做得更好.
我也尝试过: for file in "找到.*.foo -ls"; do echo $file; done
- but that gives all of the responses from find in one long line.
任何提示?我很高兴任何解决方法,但我很沮丧,我无法弄清楚这一点.
谢谢,亚历克斯
(嗨马特!)
是否有人在shell中看到过,试图实现或以其他方式使用TAP?我们正在寻找跨多种语言创建单元测试(不要让我开始为什么到目前为止还没有这个),而且由于我们有很多Perl代码,我们将会关注TAP(其中包括I)想像).我找到了一个用于C的TAP库,Perl,当然,内置它,我甚至找到了一个Java的API.但缺少的一个方面是shell脚本测试.
并非我在单元测试shell脚本上发现了很多,但由于我们确实有数千行shell代码,所以能够以某种方式测试它会很好.
这与HPUX上运行进程的可执行文件的完整路径类似,但AIX除外.
基本问题是:在AIX上,我如何确定当前可执行文件的完整路径?在做任何其他事情之前必须这样做(例如chdir),这很好.
到目前为止,我发现的最准确的答案是检查输出
svmon -P $$ -O format=nolimit,filename=on,filtertype=client
(其中$$有shell的意思是:当前的pid).这不仅是大量的C,而且svmon也不是很快,并且很容易压倒其余应用程序的运行时.
下一个最佳答案似乎只是简单地看一下argv[0],如果它有一个斜杠,它可以是一个完整的路径名(以前导/开头)或相对于当前的目录名(不是从头开始)领先/).如果它没有斜线,它就相对于某些东西而言PATH.
如果在这个解决方案之后,我最终得到了一个符号链接,那么也需要处理所有符号链接(硬链接可能超出任何解决方案的范围).这个解决方案看起来像是相对跨平台的,但在C代码中也很重(应该比svmon更快).我希望有竞争条件等等.
谢谢,
更新:我正在寻找一个提交给perl开发者的解决方案.而且他们会担心不安全的PATH,尤其是在setuid/ setgid场景.见perlsec.我认为我们可以在这里做好,但如果你结合setuid假装argv[0],你可以强迫perl认为它在其他地方,并加载错误的模块.上面的"下一个最佳"答案只有在perl的污点模式下才能真正起作用.
我想使用正则表达式(Perl兼容)能够找到由其他两个模式包围的模式,但不包括匹配匹配中周围模式的字符串.
例如,我希望能够找到字符串的出现次数:
Foo Bar Baz
但只有匹配包括中间部分:
酒吧
我知道这是可能的,但我不记得该怎么做了.
调用程序时为什么自动生效不起作用?在这种情况下有没有办法禁止它?
#!/usr/bin/env perl
no autovivification;
use Data::Dumper;
sub testsub { }
my $task;
print Dumper($task); # $VAR1 = undef;
my $a = $task->{parent_id};
print Dumper($task); # $VAR1 = undef;
my $b = testsub($task->{parent_id});
print Dumper($task); # $VAR1 = {};
Run Code Online (Sandbox Code Playgroud) 我有一个类似的字符串
XXXXYYYYZZZYYZZZYYYY需要转换为
XXXXAAAYZZZAYZZZAAAY
$s =~ s/Y{2}+/AY/g;
这有2个问题,{2}+将YYYY转到AYAY;并且AY与YYYY(预期AAAY)的长度不同
如何在Perl中完成这项工作?
我可以使用一些帮助来编写正则表达式.在我的Django应用程序中,用户可以点击以下URL:
http://www.example.com/A1/B2/C3
Run Code Online (Sandbox Code Playgroud)
我想创建一个允许接受以下任何一个有效URL的正则表达式:
http://www.example.com/A1
http://www.example.com/A1/B2
http://www.example.com/A1/B2/C3
Run Code Online (Sandbox Code Playgroud)
我猜我需要使用"OR"条件,但是我无法让我的正则表达式进行验证.有什么想法吗?
更新:到目前为止这是正则表达式.请注意,我没有包含" http://www.example.com "部分 - Django为我处理.我只关心验证1,2或3个子目录.
^(\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20}))$
Run Code Online (Sandbox Code Playgroud) 我需要在我的sql脚本中找到"(+)"的出现位置(即Oracle外连接表达式).意识到"+","("和")"都是特殊的正则表达式字符,我试过:
grep "\(\+\)" *
现在这确实返回"(+)"的出现,但也返回其他行.(看起来在同一条线上有任何开放和关闭的parens.)回想一下parens只适用于扩展grep,我试过:
grep "(\+)" * grep "(\\+)" *
这两个都只返回包含"()"的行.因此,假设"+"无法转义,我尝试了一个老技巧:
grep "([+])" *
这样可行.我用非正则表达式工具交叉检查结果.
问题:有人可以用"+"字符解释究竟发生了什么吗?在"(+)"上匹配的方式是否较少?
(我正在使用cygwin grep命令.)
编辑:谢谢你的解决方案.- 现在我看到,根据Bruno引用的GNU grep手册," \+"在基本表达式中使用时,"+"表示扩展含义,因此匹配一个或多个"("s后跟一个") ".在我的文件中,总是"()".
我想更改IP的最后一位。
IP=10.10.10.10
echo $ip |cut -d"." -f1-3
Run Code Online (Sandbox Code Playgroud)
将显示“ 10.10.10”我想包括“ .0”