[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样替换文本文件中包含某字符的行?

最近学习脚本碰到一难题,请各位不吝赐教
假设有一文本文件d:\a.txt内容如下
  1. abc = 111
  2. bcd = 111
  3. cde = 222
复制代码
以上几行内容排序并不固定,比如“abc = 111”可能在第二行,有空行,也有空格
假设我需要把包含“cde”的这一行找到,并把这一整行的内容改成“abcde = 111”这个批处理改怎么写
授人以鱼不如授人以渔,请大神解答时稍微解释下,谢谢

  1. sed "/cde/ s/.*/abcde = 111/" a.txt > b.txt
复制代码

TOP

回复 2# DAIC


    又学习一招,原来s那一串写在后边是这个意思。

TOP

回复 3# Linuxer


是的
s是substitution的缩写
作用是:字符串替换

TOP

回复 4# DAIC


   哦, 了解了。我的意思是我只会用 sed “s/1/2/" 这样来处理,没想到可以 sed "/1/ s/.*/3/" 这样操作。

TOP

回复 5# Linuxer


s前面有两种常见的用法:

1、替换包含指定字符串的行
sed "/abc/ s/.*/3/"

2、替换第一行到第五行
sed "1,5 s/.*/3/"

TOP

本帖最后由 weichenxiehou 于 2014-8-8 23:20 编辑

回复 6# DAIC
更准确地讲,s前面为定址部分,可为:
[pattern1[,pattern2]]
中括号表示可能有也可能没有,pattern1和pattern2可以是数字、$和正则表达式中的一种。
看得多说得多,远比不上写得多。

TOP

本帖最后由 CrLf 于 2014-8-9 04:27 编辑

回复 7# weichenxiehou


    特地去翻了gnu sed在线手册的Addresses部分,才发现还有三种没见过的定址语法:
  1. addr1~N
  2. 从 addr1 开始每隔 N 行
  3. addr1,+N
  4. 从 addr1 开始到 addr1 后第 N 行
  5. addr1,~N
  6. 从 addr1 开始直到行号能被 N 整除的行
复制代码
addr1 可以为 number 或 /regexp/
-----------------------------------------------------------------------------------
翻手册的时候还发现,原来 sed 的 s 也支持 perl 的 \U \u \L \l \E 几个特殊,太棒了,举个简单的应用实例:
  1. echo bbs.BATHOME.net | sed "s/[[:alpha:]]*/\L\u&\E/g"
  2. rem 将单词转为小写,但首字母大写
复制代码
-----------------------------------------------------------------------------------
还知道了 \` 和 \' 可在多行模式下匹配整个模式空间的头尾,相当于不启用 m 时的 ^ 和 $
-----------------------------------------------------------------------------------
唔,果然是要多翻手册

TOP

回复 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的人搞不清楚的。
对于初学者来说只看教程很难理解,遇到具体问题的时候再慢慢学习吧。

TOP

回复 9# DAIC


    问题解决了,太感谢了!
  但是有个疑问,这个命令会生成一个新的文件b.txt,虽然用del,和ren组合会把b.txt 改成原来的a.txt,我想问的是能直接修改保存而不用这样么?英文太烂,帮助信息看的头疼.......

TOP

回复 10# xu191
  1. sed -i "/cde/ s/.*/abcde = 111/" a.txt
复制代码

TOP

xiexiexie!!

TOP

返回列表