LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
精华主题  
主题工具
旧 04-03-01, 15:34 第 1 帖
littlepig
 
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: MTL QC Canada
  帖子: 467
  精华: 1
 

标题: 变态vi问答


有个文本文件内容如下:
new
newabc
news
newspaper
new new newspaper
new newsabc

BT问:如何把所有的new读换成old?
小猪答:简单: % s/new/old/g
结果如下:
old
oldabc
olds
oldspaper
old old oldspaper
old oldsabc

BT:我要只有单词new变成old,其它所有甚么news,newxxx中的new不变
小猪挠了挠头:嗯... 这样,用精确匹配: % s/\<new\>/old/g
结果如下:
old
newabc
news
newspaper
old old newspaper
old newsabc

BT:现在我要单词new不变,其它所有甚么news, newxxx中的new都变成old
小猪又挠了挠头:嗯... % s/new\([^ ]\{1\}\)/old\1/g,结果如下:
new
oldabc
olds
oldspaper
new new oldspaper
new oldsabc

BT:现在文件内容增加了,加上 abcnews, abcnew, xxxnewyyy,
new
newabc
news
newspaper
new new newspaper
new newsabc
abcnews abcnew abcnewspaper
要求所有单词new都不变,其它诸如xxxnew, xxxnewyyy之类的含有new的单词中的new变成old.
小猪:晕.......

哪位大虾救救猪头?
  littlepig 当前离线   回复时引用此帖
旧 04-03-01, 16:29 第 2 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

代码:
cat file|sed -e 's/new/old/g' -e 's/\<old\>/new/g'
  KornLee 当前离线   回复时引用此帖
旧 04-03-01, 16:42 第 3 帖
littlepig
 
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: MTL QC Canada
  帖子: 467
  精华: 1
 

引用:
最初由 javalee 发表
代码:
cat file|sed -e 's/new/old/g' -e 's/\<old\>/new/g'
多谢,不过这个方法小猪是知道的,在vi底下也可以通过两次substitute实现,不过觉得不是很美,我想知道有没有只用一次匹配就完成替换的办法。
另外,这个方法的一个问题是万一原文中有old这个词但又不许被改掉就糟糕了:o
  littlepig 当前离线   回复时引用此帖
旧 04-03-01, 16:57 第 4 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

是够BT的~~~
  KornLee 当前离线   回复时引用此帖
旧 04-03-01, 17:23 第 5 帖
littlepig
 
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: MTL QC Canada
  帖子: 467
  精华: 1
 

乍一开始,我企图用% s/\([^ ]\{1\}\)new\([^ ]\{1\}\)/\1old\2/g来做,但是仔细一想,这个式子只能匹配xxxnewyyy这种模式,对于newxx和xxxnew这样的无效,所以不得以再匹配替换两次,太麻烦了,有没有甚么好的匹配方法将xxxnewyyy, xxxnew, newxxx这三种情况一网打尽,并且保留前/后的字符串,只将里面的new摘出来换掉。
偷偷地告诉javalee,这是两年前有个变态公司面试时候问小猪的,今天忽然向起来就向大伙儿请教了。
  littlepig 当前离线   回复时引用此帖
旧 04-03-01, 18:07 第 6 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 littlepig 发表
乍一开始,我企图用% s/\([^ ]\{1\}\)new\([^ ]\{1\}\)/\1old\2/g来做,但是仔细一想,这个式子只能匹配xxxnewyyy这种模式,对于newxx和xxxnew这样的无效,所以不得以再匹配替换两次,太麻烦了,有没有甚么好的匹配方法将xxxnewyyy, xxxnew, newxxx这三种情况一网打尽,并且保留前/后的字符串,只将里面的new摘出来换掉。
偷偷地告诉javalee,这是两年前有个变态公司面试时候问小猪的,今天忽然向起来就向大伙儿请教了。
呵呵~~,我也卡在这里啦~~ ,:(
  KornLee 当前离线   回复时引用此帖
旧 04-03-01, 23:12 第 7 帖
seablue
 
seablue 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: 银河系
  帖子: 999
  精华: 3
 

用vim可以这样:
代码:
new oldabc olds oldspaper new new oldspaper new oldsabc abcolds abcold abcoldspaper ~ ~ : % s/\([^ ]\{1\}\)new\|new\([^ ]\{1\}\)/\1old\2/g







__________________
linux中级用户
  seablue 当前离线   回复时引用此帖
旧 04-03-01, 23:34 第 8 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 seablue 发表
用vim可以这样:
代码:
new oldabc olds oldspaper new new oldspaper new oldsabc abcolds abcold abcoldspaper ~ ~ : % s/\([^ ]\{1\}\)new\|new\([^ ]\{1\}\)/\1old\2/g
代码:
sed 's/\([^ ]\{1\}\)new\|new\([^ ]\{1\}\)/\1old\2/g'
原来卡在这里! 谢谢seablue兄!
  KornLee 当前离线   回复时引用此帖
旧 04-03-02, 11:39 第 9 帖
littlepig
 
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: MTL QC Canada
  帖子: 467
  精华: 1
 

妙!
嗯,多年来的疙瘩终于解开了,多谢论坛中热心的哥们。

此帖于 04-03-02 11:44 被 littlepig 编辑.
  littlepig 当前离线   回复时引用此帖
旧 04-03-02, 19:32 第 10 帖
dearvoid
 
 
 
注册会员  
  注册日期: Feb 2004
  我的住址: Beijing
  帖子: 282
  精华: 0
 

perl, sed, grep, awk, vim 都支持 |







__________________
.
欢迎到 Linux 伊甸园 shell 论坛做客 - www.linuxeden.com
  dearvoid 当前离线   回复时引用此帖
旧 04-03-02, 19:33 第 11 帖
dearvoid
 
 
 
注册会员  
  注册日期: Feb 2004
  我的住址: Beijing
  帖子: 282
  精华: 0
 

bash 也有
  dearvoid 当前离线   回复时引用此帖
旧 04-03-03, 14:32 第 12 帖
kissingwolf 帅哥
 
kissingwolf 的头像
 
 
资深版主  
  注册日期: Jul 2003
  我的住址: 上海
  帖子: 1,306
  精华: 15
 

BT的正则表达式!







__________________
那些作恶的和协助作恶的都将在审判日被钉在耻辱柱上
不论他今天站的多高,不论他今天如何叫嚣
到那一天,G00g1e会回来的

++++++++++++KevinZou++++++++++++++
Keep Everything Simple , Palpable
kissingwolf
++++++++++++++++++++++++++++++++
在培训版发贴前请先在置顶的贴子里找找!
拒绝回答愚蠢的问题!愚蠢的问题表现为:
不告知发行版及版本类型
不告知尝试操作和相关环境配置
不告知问题解决目的
  kissingwolf 当前离线   回复时引用此帖
旧 04-03-03, 14:51 第 13 帖
frankie
 
frankie 的头像
 
 
注册会员  
  注册日期: Jul 2003
  帖子: 81
  精华: 1
 

强,太强了!好好学习啊







__________________
为兄弟两肋插刀,为美女插兄弟两刀。兄弟如手足,美女如衣服,谁穿我衣服我砍他手足;美女如衣服,兄弟如手足,谁动我手足我穿他衣服!!!
  frankie 当前离线   回复时引用此帖
旧 04-03-10, 14:44 第 14 帖
八百里
 
 
 
注册会员  
  注册日期: Nov 2003
  帖子: 102
  精华: 0
 

这算不算跟自己过不去啊?
  八百里 当前离线   回复时引用此帖
旧 04-03-11, 13:06 第 15 帖
waker
 
waker 的头像
 
 
注册会员  
  注册日期: Nov 2002
  帖子: 173
  精华: 0
 

"new new -new new.xxx yyy-new new new new"

"old old -new new.xxx yyy-new old old old"
怎么写呢?







__________________
LFS ID 9699
学习笔记 http://waker.hkjzone.com
  waker 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 12:31


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org