Board logo

标题: [文本处理] 批处理如何在文本中替换指定行文字? [打印本页]

作者: szhgj    时间: 2012-6-16 19:02     标题: 批处理如何在文本中替换指定行文字?

在一个1.txt文件中有一段文字:
...............................
file /sbin/geno initrd\sbin\geno 0750
.........................

我需要把这一行的 0750 替换成 0787

前提:在这个txt 中有很多0750的字段
作者: CrLf    时间: 2012-6-16 19:24

  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.    if "%%a"=="/sbin/geno initrd\sbin\geno 0750" (
  4.       echo /sbin/geno initrd\sbin\geno 0787
  5.    ) else echo %%a
  6. )
复制代码

作者: weichenxiehou    时间: 2012-6-16 21:35

  1. sed -i "\#^file /sbin/geno initrd\\sbin\\geno 0750$#s/0750/0787/" 1.txt
复制代码

作者: forfiles    时间: 2012-6-18 08:35

回复 3# weichenxiehou
  1. sed -r -i "s#(^file /sbin/geno initrd\\sbin\\geno) 0750$#\1 0787#" a.txt
复制代码

作者: weichenxiehou    时间: 2012-6-18 09:08     标题: 标题

回复 4# forfiles
只是把正则表达式放到s命令的匹配部分而已,我是放在定址部分。而且阁下的代码有语法错误吧?是\( \)而不是( ),不对括号转义会被当成一般字符。
作者: forfiles    时间: 2012-6-18 10:16

回复 5# weichenxiehou


    阁下不知道-r的作用吧?
作者: weichenxiehou    时间: 2012-6-18 11:15     标题: 标题

回复 6# forfiles
发完帖我就意识到可能是-r的差异了,这个开关确实没用过,还望指教。不知道sed的扩展正则表达式与通常意义上的扩展正则表达式有多大差异,我只知道后者用括号将正则表达式组合,以按单个字符的方式处理,接触的sed正则表达式也确实没介绍。
作者: forfiles    时间: 2012-6-18 12:45

回复 7# weichenxiehou


http://en.wikipedia.org/wiki/Reg ... Regular_Expressions
作者: weichenxiehou    时间: 2012-6-18 14:03

本帖最后由 weichenxiehou 于 2012-6-18 14:04 编辑

回复 8# forfiles
以前没太关注这个开关的用途,因为没大发现它的作用,今天遇到了就研究了一下,进linux看sed的info page找到了答案:默认是用基本的正则表达式,加-r参数是使能扩展的正则表达式,两者仅在使用4个字符上存在差异(? + () {}),基本正则表达式需要对它们进行转义才能使用它们的特殊含义,而扩展正则表达式默认将它们视为特殊字符,不需要转义。也就是说,使用-r参数唯一的用处就是让代码更易读。
感谢发送链接,用手机登的论坛,公司外网很烂,没来得及看网页,也是偷偷用u盘进的linux。
作者: poter    时间: 2012-6-18 20:01

@echo off
setlocal enableDelayedExpansion
for /f "tokens=*" %%i in ('findstr "0750" 1.txt') do (
        set a=%%i&set "a=!a:0750=0787!"
        echo !a!
)
作者: forfiles    时间: 2012-6-18 23:34

回复 10# poter


    楼主说的很明确:在这个txt 中有很多0750的字段,不能乱替换啊
作者: Hello123World    时间: 2012-8-13 17:19

为什么要弄那么复杂,他不过是想替换 0750
  1. sed -i 's/0750/0787/g' 1.txt
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2