This topic has been archived. It cannot be replied.
-
工作学习 / IT技术讨论 / 遇到了一个vi的问题在一段文本中想同时match两个string, 举例
first second third
secong third forth
我只想找同时有first和second的那一行(第一行),如何找。
不能离开vi 用grep之类的命令
-guest:guest;
2001-4-10
{169}
(#43159@0)
-
没有试过,用 :/ "first second" 行不行?我是指将要查询的内容用单引号或双引号括起来? 请将试验结果告知,谢谢 :-)
-flying_snow(飞雪浮冰);
2001-4-10
(#43164@0)
-
"first second"实际上是一个字符串。我以前也碰过这个问题,不过好象没找到办法。guest其实想做什么呢?可以说来听听吗?干嘛非在vi里不可?
-pasu(InTheSky);
2001-4-10
(#43166@0)
-
举个例子如果在log file里面我收到很多不同类型的message, 每个message有他自己的标志,例如MSG_1,MSG_2,...,在每个message里面,都可能有一个类似于人名的特征字,我想在特定的message类型中查找这个人名,例如,MSG_1&PETER, 同时,我可能又要查找MSG_2&JOHN, 如果把每个不同的message生成不同的子文件,太麻烦了。
-guest:guest;
2001-4-10
{287}
(#43168@0)
-
我也估计到你应该是在做数据处理。不过我想了一下,似乎在vi里面要搜索满足两个条件的行是没有可能的。因为vi实际上是在调用ex行编辑器,而要找出同时满足两个条件的行的话,一定有一些行是要进入两次的。而ex的行扫描方式决定了不可能在一个搜索命令里面把某些行扫描两次,必须要用两个搜索命令并借助临时文件(不一定在磁盘上)。但是在vi里你没有办法这样做。
-pasu(InTheSky);
2001-4-10
{240}
(#43183@0)
-
为什么不用grep -e MSG_1 -e PETER logfile
-pasu(InTheSky);
2001-4-10
(#43184@0)
-
我不是说了吗。可能同时在一个文件里面,我查完了MSG_1&PETER之后,马上要查MSG_2&JOHN, ...可能还有别的,这样就要生程序都临时文件。
-guest:guest;
2001-4-10
{112}
(#43188@0)
-
那你在vi里不也是要敲完一次又一次?有什么区别?
-pasu(InTheSky);
2001-4-10
(#43191@0)
-
不一样如果你生成不同的文件,每次查找不同的pattern,你必须调入不同的文件,不能同时调入所有的子文件
-guest:guest;
2001-4-10
{90}
(#43235@0)
-
你就不能grep -e MSG_1 -e PETER logfile >> tmpfile; grep -e MSG_2 -e SIMOM logfile >> tmpfile; ...............?写个script吧,这种数据处理用vi是最麻烦的方法了。
-pasu(InTheSky);
2001-4-10
(#43239@0)
-
Great! 等于重新排了序! :-)
-flying_snow(飞雪浮冰);
2001-4-10
(#43245@0)
-
可是我事先并不知道MSG_1,MSG_2,PTER,JOHN之间谁和谁组合呀.
-guest:guest;
2001-4-10
(#43248@0)
-
那你什么时候才知道?你总要在敲命令前知道吧?我的意思是用vi真的不合适做数据处理,不如写个小script。
-pasu(InTheSky);
2001-4-10
(#43250@0)
-
比如我在查MSG_1&PETER时,发现我需要查MSG_1&JOHN, 查MSG_1&JOHN时,发现我需要查MSG_2&JOHN...
-guest:guest;
2001-4-10
{85}
(#43260@0)
-
那你就每次把grep的结果>>进一个文件好了,除非你想修改那个源文件。
-pasu(InTheSky);
2001-4-10
(#43318@0)
-
是不是要离开vi grep?我不想离开,而且我是根本前一个search的结果才能决定下一次search什么。不能事先确定
-guest:guest;
2001-4-10
{80}
(#43324@0)
-
那你可以敲个:!暂时进入shell里面去grep,不过要小心尽快回来,不然容易搞混了出事,曾经有人试过进了shell又vi又进shell...如此多次,最后不小心把数据搞丢了。
-pasu(InTheSky);
2001-4-10
(#43348@0)
-
啊,还是不对,写个小script吧:grep -e \<$1\> -e \<$2\> logfile >> tmpfile;grep -e \<$1\> -e \<$2\> tmpfile 这样就可以立即看见结果并写入tmpfile了。
-pasu(InTheSky);
2001-4-10
(#43352@0)
-
你还是没理解如果我些了一个tmp文件,发现我要找另外的,又要写一个tmp文件,...起步是很麻烦?
-guest:guest;
2001-4-10
{77}
(#43383@0)
-
你就不可以每次都添加到同一个tmpfile里去吗?
-pasu(InTheSky);
2001-4-10
(#43388@0)
-
添加到同一个tmp文件里,选的时候不又打架了吗?
-guest:guest;
2001-4-10
(#43398@0)
-
Stupid ah! The correct command should be : grep MSG_1 logfile|grep PETER
-pasu(InTheSky);
2001-4-11
(#43807@0)
-
/first*+second/
-lumlumq(lumlum);
2001-4-10
(#43169@0)
-
什么东西?
-guest:guest;
2001-4-10
(#43172@0)
-
sorry, type, should be /first.*second/
-lumlumq(lumlum);
2001-4-10
(#43174@0)
-
don't forget the dot "." before "*"
I suggest you read the man page for regular expressions
man -s5 regex
-lumlumq(lumlum);
2001-4-10
(#43177@0)
-
.(dot)是什么意思?
-guest:guest;
2001-4-10
(#43181@0)
-
dot is a special character in REit means "matching for any characters", and "*" is a
special character in RE too, it means "any repetition
of the previous RE(could be 0)"
-lumlumq(lumlum);
2001-4-10
{148}
(#43185@0)
-
好使,讲讲什么原理好吗?
-guest:guest;
2001-4-10
(#43180@0)
-
vi supports basic regular expression,I don't like basic regular expression because it's too limited
you should try out awk or nawk, it's a coooool gadget.
awk and nawk both support extended RE, you can write
very sophisticated text processing programs with them.
-lumlumq(lumlum);
2001-4-10
{232}
(#43182@0)
-
.(dot) means any single character or nothing. *(star) means repeat the precedence character.
-pasu(InTheSky);
2001-4-10
(#43186@0)
-
应该是 /first.*second 。这是个变通的办法,实际上还是在搜索一个字符串,不过应该是 /first.*second 和 /second.*first 都做一次,如果没有指定first一定在second前面的话。
-pasu(InTheSky);
2001-4-10
(#43176@0)
-
Thanks! Learned a lot! :-)
-flying_snow(飞雪浮冰);
2001-4-10
(#43179@0)
-
thanks a lot, lumlum and InTheSky.
-guest:guest;
2001-4-10
(#43190@0)
-
nothing. //hand lumlum //hand guest //hand 飞雪浮冰
-pasu(InTheSky);
2001-4-10
(#43193@0)
-
You are welcome. I wish I could understand what I am talking about, xixi,,, lumlum ^_^
-lumlumq(lumlum);
2001-4-10
(#43195@0)
-
?? you puzzled me...
-pasu(InTheSky);
2001-4-10
(#43198@0)
-
/first second
-hotpot(麻辣烫);
2001-4-10
(#43255@0)
-
这样只会match那个first。
-pasu(InTheSky);
2001-4-10
(#43259@0)
-
I tried it on Unix several minutes ago.. It works. and It doesn't find the second line "second first" .
-hotpot(麻辣烫);
2001-4-10
(#43280@0)
-
how to match 'first third second'?
-guest:guest;
2001-4-10
(#43309@0)
-
now I am 100% sure
-hotpot(麻辣烫);
2001-4-10
(#43287@0)
-
sorry, I misunderstood question. lumlum is right
-hotpot(麻辣烫);
2001-4-10
(#43307@0)
-
研究了一下,最正确的表达应该是/s\<first\>.\<second\>
如果用其他的,会把类似1first,2second之类的也算做match 成功
-guest:guest;
2001-4-10
{86}
(#43339@0)
-
对对。不过是不是应该是 s/\<first\>.*\<second\> 呢?
-pasu(InTheSky);
2001-4-10
(#43350@0)
-
*有什么用呢?
-guest:guest;
2001-4-10
(#43354@0)
-
* means repeat the former character. Because there may be more than one characters between the two object words.
-pasu(InTheSky);
2001-4-11
(#43755@0)