标题: [文本处理] 批处理如何在文本中替换指定行文字? [打印本页]
作者: 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
- @echo off
- for /f "delims=" %%a in (a.txt) do (
- if "%%a"=="/sbin/geno initrd\sbin\geno 0750" (
- echo /sbin/geno initrd\sbin\geno 0787
- ) else echo %%a
- )
复制代码
作者: weichenxiehou 时间: 2012-6-16 21:35
- sed -i "\#^file /sbin/geno initrd\\sbin\\geno 0750$#s/0750/0787/" 1.txt
复制代码
作者: forfiles 时间: 2012-6-18 08:35
回复 3# weichenxiehou - 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- sed -i 's/0750/0787/g' 1.txt
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |