Board logo

标题: [文本处理] [已解决]批处理如何实现从文本指定行开始每行开头加分号? [打印本页]

作者: jellyhk    时间: 2011-12-10 21:51     标题: [已解决]批处理如何实现从文本指定行开始每行开头加分号?

本帖最后由 pcl_test 于 2016-11-17 12:36 编辑

文件ip.txt里[文件内容要可变]
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
复制代码
1:从第3行开始每行加分号;其他不变---得到结果
  1. 1
  2. 2
  3. ;3
  4. ;4
  5. ;5
  6. ;6
  7. ;7
  8. ;8
  9. ;9
复制代码
问题2:如何把取消前2行前的分号;其他不变!
  1. ;1
  2. ;2
  3. ;3
  4. ;4
  5. ;5
  6. ;6
  7. ;7
  8. ;8
  9. ;9
复制代码

作者: CrLf    时间: 2011-12-10 23:35

  1. sed "3,$s/.*/;&/" 1.txt
复制代码
  1. sed "1,2s/^;//" 1.txt
复制代码

作者: Demon    时间: 2011-12-11 00:29

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n = 0
  4. (for /f %%i in (ip.txt) do (
  5.     set /a n = n + 1
  6.     if !n! geq 3 (
  7.         echo ;%%i
  8.     ) else (
  9.         echo %%i
  10.     )
  11. )) > 1.txt
  12. pause
复制代码

作者: jellyhk    时间: 2011-12-11 11:12

回复 3# Demon
为什么要用set /a n=0?
set n=0一样么?
作者: weichenxiehou    时间: 2011-12-11 11:23

  1. gawk "{print (NR>2?\";\":\"\")$0}" 1.txt
复制代码
  1. gawk "{print substr($0,NR>2?1:2)}" 1.txt
复制代码

作者: weichenxiehou    时间: 2011-12-11 11:29

回复 4# jellyhk
一样,在此别无二致,只是从形象上来理解,加了/a后等号成了数值赋值运算符,没加的时候等号只是字符串赋值给变量的运算符而已,在此没什么区别,但是set/a a=aa时a只会是等于0。
作者: jellyhk    时间: 2011-12-11 13:22

为什么 =0呢set/a a=aa
作者: weichenxiehou    时间: 2011-12-11 13:39

回复 7# jellyhk
因为开启了/a开关,等号右边就需要是有效地计算式,但aa不是有效的算式,规定设成0吧。
作者: awk    时间: 2011-12-11 14:05

回复 5# weichenxiehou


1:
  1. gawk "NR>2{gsub(/^/,\";\")}1" a.txt
复制代码
  1. gawk "NR>2{printf \";\"}1" a.txt
复制代码
  1. gawk "NR>2{$0=\";\"$0}1" a.txt
复制代码

作者: awk    时间: 2011-12-11 14:08

回复 2# CrLf
  1. sed "3,$s/^/;/" a.txt
复制代码

作者: weichenxiehou    时间: 2011-12-11 16:48

回复 9# awk
大侠能否讲解一下你的awk程式,着实看不懂,特别是最后那个1,发现替换成其他数字也可以。谢谢~
作者: awk    时间: 2011-12-11 22:13

回复 11# weichenxiehou


awk默认的action是print $0
只要是非0的条件它都会执行默认的action
作者: weichenxiehou    时间: 2011-12-11 22:52

回复 12# awk
哦,这么说我倒是明白了,后面又是一个pattern{action}搭配。gsub默认第三个参数为$0?第一个和第三个程式都是对$0进行处理,第二个之所以用printf是因为不会像printf默认输出ORS换行?代码还真是简洁……
作者: Hello123World    时间: 2011-12-12 13:15

1.
  1. @echo off&SetLocal EnableDelayedExpansion
  2. Set n=1
  3. (For /f %%i in (ip.txt) do (
  4. If !n! geq 3 (echo.;%%i) else (echo %%i)
  5. Set /a n+=1)
  6. )>11.txt
  7. start 11.txt
  8. pause>nul
复制代码
.


2.
  1. @echo off&SetLocal EnableDelayedExpansion
  2. Set n=1
  3. (For /f "delims=;" %%i in (ip.txt) do (
  4. If !n! leq 2 (echo.%%i) else (echo ;%%i)
  5. Set /a n+=1)
  6. )>11.txt
  7. start 11.txt
  8. pause>nul
复制代码

作者: cjiabing    时间: 2011-12-12 15:45

手机上,请原谅!
加分号:
for /f "skip=2 delims="  %%a in (a.txt) do echo ;%%a

去分号:
用findstr也可以
for  /f "tokens=1* delims=:;"  %%a in (a.txt) do (

f %%a==1
作者: CrLf    时间: 2011-12-12 16:22

回复 14# Hello123World


回复 15# cjiabing


    别忘了默认情况下,for /f 隐含了 eol=; 的条件,会跳过以分号开头的行,我想这可能是楼主疑惑的原因之一。
作者: Hello123World    时间: 2011-12-13 12:27

本帖最后由 Hello123World 于 2011-12-13 12:35 编辑

回复 16# CrLf


eol=;这种默认设置,在delims=;时变得无效

For /f "delims=;" %%i in (ip.txt) do echo %%i
For /f "eol=; delims=;" %%i in (ip.txt) do echo %%i
都是可以输出的。

For /f %%i in (ip.txt) do echo %%i 却输出为空。




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