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

[文本处理] 批处理如何在文本中替换指定行文字?

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

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

前提:在这个txt 中有很多0750的字段

  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. )
复制代码

TOP

  1. sed -i "\#^file /sbin/geno initrd\\sbin\\geno 0750$#s/0750/0787/" 1.txt
复制代码
看得多说得多,远比不上写得多。

TOP

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

TOP

标题

回复 4# forfiles
只是把正则表达式放到s命令的匹配部分而已,我是放在定址部分。而且阁下的代码有语法错误吧?是\( \)而不是( ),不对括号转义会被当成一般字符。
看得多说得多,远比不上写得多。

TOP

回复 5# weichenxiehou


    阁下不知道-r的作用吧?

TOP

标题

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

TOP

TOP

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

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

TOP

@echo off
setlocal enableDelayedExpansion
for /f "tokens=*" %%i in ('findstr "0750" 1.txt') do (
        set a=%%i&set "a=!a:0750=0787!"
        echo !a!
)

TOP

回复 10# poter


    楼主说的很明确:在这个txt 中有很多0750的字段,不能乱替换啊

TOP

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

TOP

返回列表