标题: [文本处理] 批处理怎样替换文本文件中包含某字符的行? [打印本页]
作者: xu191 时间: 2014-8-8 10:30 标题: 批处理怎样替换文本文件中包含某字符的行?
最近学习脚本碰到一难题,请各位不吝赐教
假设有一文本文件d:\a.txt内容如下- abc = 111
-
- bcd = 111
-
- cde = 222
复制代码
以上几行内容排序并不固定,比如“abc = 111”可能在第二行,有空行,也有空格
假设我需要把包含“cde”的这一行找到,并把这一整行的内容改成“abcde = 111”这个批处理改怎么写
授人以鱼不如授人以渔,请大神解答时稍微解释下,谢谢
作者: DAIC 时间: 2014-8-8 12:32
- sed "/cde/ s/.*/abcde = 111/" a.txt > b.txt
复制代码
作者: Linuxer 时间: 2014-8-8 13:13
回复 2# DAIC
又学习一招,原来s那一串写在后边是这个意思。
作者: DAIC 时间: 2014-8-8 15:57
回复 3# Linuxer
是的
s是substitution的缩写
作用是:字符串替换
作者: Linuxer 时间: 2014-8-8 16:14
回复 4# DAIC
哦, 了解了。我的意思是我只会用 sed “s/1/2/" 这样来处理,没想到可以 sed "/1/ s/.*/3/" 这样操作。
作者: DAIC 时间: 2014-8-8 16:21
回复 5# Linuxer
s前面有两种常见的用法:
1、替换包含指定字符串的行
sed "/abc/ s/.*/3/"
2、替换第一行到第五行
sed "1,5 s/.*/3/"
作者: weichenxiehou 时间: 2014-8-8 23:19
本帖最后由 weichenxiehou 于 2014-8-8 23:20 编辑
回复 6# DAIC
更准确地讲,s前面为定址部分,可为:
[pattern1[,pattern2]]
中括号表示可能有也可能没有,pattern1和pattern2可以是数字、$和正则表达式中的一种。
作者: CrLf 时间: 2014-8-9 04:16
本帖最后由 CrLf 于 2014-8-9 04:27 编辑
回复 7# weichenxiehou
特地去翻了gnu sed在线手册的Addresses部分,才发现还有三种没见过的定址语法:- addr1~N
- 从 addr1 开始每隔 N 行
-
- addr1,+N
- 从 addr1 开始到 addr1 后第 N 行
-
- addr1,~N
- 从 addr1 开始直到行号能被 N 整除的行
复制代码
addr1 可以为 number 或 /regexp/
-----------------------------------------------------------------------------------
翻手册的时候还发现,原来 sed 的 s 也支持 perl 的 \U \u \L \l \E 几个特殊,太棒了,举个简单的应用实例:- echo bbs.BATHOME.net | sed "s/[[:alpha:]]*/\L\u&\E/g"
- rem 将单词转为小写,但首字母大写
复制代码
-----------------------------------------------------------------------------------
还知道了 \` 和 \' 可在多行模式下匹配整个模式空间的头尾,相当于不启用 m 时的 ^ 和 $
-----------------------------------------------------------------------------------
唔,果然是要多翻手册
作者: DAIC 时间: 2014-8-9 10:38
回复 7# weichenxiehou
是的
再往深处讲:
range operator maintains its own Boolean state.
It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, after which the range operator becomes false again.
The operator doesn’t become false until the next time it is evaluated.
If the second address is a REGEXP, then checking for the ending match will start with the line _following_ the line which matched the first address: a range will always span at least two lines (except of course if the input stream ends).
第一个和第二个address分别是number和REGEXP的情况有不同的组合,具体表现也不同。
这是很多用sed的人搞不清楚的。
对于初学者来说只看教程很难理解,遇到具体问题的时候再慢慢学习吧。
作者: xu191 时间: 2014-8-10 08:57
回复 9# DAIC
问题解决了,太感谢了!
但是有个疑问,这个命令会生成一个新的文件b.txt,虽然用del,和ren组合会把b.txt 改成原来的a.txt,我想问的是能直接修改保存而不用这样么?英文太烂,帮助信息看的头疼.......
作者: DAIC 时间: 2014-8-11 10:16
回复 10# xu191 - sed -i "/cde/ s/.*/abcde = 111/" a.txt
复制代码
作者: hnldwhm52 时间: 2014-9-11 23:57
xiexiexie!!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |