标题: [文本处理] [已解决]BAT批处理怎样在一行中,提取多个变量? [打印本页]
作者: lky216 时间: 2014-3-11 17:24 标题: [已解决]BAT批处理怎样在一行中,提取多个变量?
本帖最后由 lky216 于 2014-3-15 09:21 编辑
需要操作的文件1.txt内容是
192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4,192.168.1.5,192.168.1.6,192.168.1.7,
只有一行,这样子的循环下去的,可能有200多个,鄙人用for i到z只能提取几个而已,
求教如何提取呢
解决方法:
1.gawk "gsub(/,/,\"\n\")" a.txt
2.sed "s/,/\n/g" a.txt
3.- @echo off
- set /p str=<a.txt
- for %%i in (%str%) do (
- echo %%i
- )
复制代码
4.- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do set "str=%%i"
- echo !str:,=^
-
- !
- pause
复制代码
感谢DAIC,感谢PowerShell,感谢terse
作者: PowerShell 时间: 2014-3-11 18:47
在powershell中,提取变量是这样做的:
1 按 [,] 切割字符串,结果成为一个数组,数组长度几万没问题。- $aaa = "192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4,192.168.1.5,192.168.1.6,192.168.1.7" -split ","
复制代码
则
$aaa[0] = 192.168.1.1
$aaa[1] = 192.168.1.2
作者: lky216 时间: 2014-3-11 18:51
回复 2# PowerShell
哈哈,公司2003系统还没升级2012呢,不过今年会升级,我回去先测试看看,等升级2012后再用,谢谢了
作者: DAIC 时间: 2014-3-12 21:56
复制代码
作者: DAIC 时间: 2014-3-12 21:57
- gawk "gsub(/,/,\"\n\")" a.txt
复制代码
作者: DAIC 时间: 2014-3-12 22:49
- @echo off
- set /p str=<a.txt
- for %%i in (%str%) do (
- echo %%i
- )
复制代码
作者: zhanglei1371 时间: 2014-3-13 07:04
回复 6# DAIC
我试了下,最多85个,再多就出不来了
作者: DAIC 时间: 2014-3-13 19:20
回复 7# zhanglei1371
把你的a.txt压缩,传上来,我试试。
作者: lky216 时间: 2014-3-13 20:31
回复 4# DAIC
for /f %i in ('sed -e "s/,/\n/g" a.txt') do echo %i
这样子好像也是输出一行的呀,烦请指教~
作者: lky216 时间: 2014-3-13 20:33
回复 5# DAIC
gawk "gsub(/,/,\"\n\")" a.txt
这个可以,谢谢您~
作者: lky216 时间: 2014-3-13 20:37
回复 7# zhanglei1371
我测试了,是86行,85行是正常的,192.168.1.1这样的,第86行只有显示192。不过多学习了一种方法,赞
作者: DAIC 时间: 2014-3-13 20:42
回复 9# lky216
4楼代码直接执行就行了,你为什么要改成这样?
作者: terse 时间: 2014-3-13 23:20
确定“,”为分割 那就直接替换- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do set "str=%%i"
- echo !str:,=^
-
- !
- pause
复制代码
作者: zhanglei1371 时间: 2014-3-13 23:40
奇怪,那天测试只打印到85个,今天再测试全都可以了
作者: terse 时间: 2014-3-14 02:19
回复 14# zhanglei1371
先前你是否用的这个 set /p str=<a.txt
作者: lky216 时间: 2014-3-14 08:44
回复 13# terse
是不是哪里写错拉,输出只有,=这两个符号
作者: lky216 时间: 2014-3-14 08:58
回复 12# DAIC
哈哈,原来下载的sed是没有i选项的,我从论坛下载一个[new]sed-4.2.1-bin.zip,可以了,不好意思啊,谢谢了。
作者: 522235677 时间: 2014-3-14 09:13
- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- set a=%%a
- set a=!a:,= !
- for %%b in (!a!) do (
- echo %%b
- )
- )
- pause
复制代码
你看这样行不行呢
作者: zhanglei1371 时间: 2014-3-14 10:20
回复 15# terse
是的。为何使用这句会有85个的限制?
作者: lky216 时间: 2014-3-14 11:25
回复 18# 522235677
空的,只有按任意键继续。DAIC的,sed和gawk不错,用第三方的也可以拉,
作者: DAIC 时间: 2014-3-14 11:29
回复 18# 522235677
逗号本身也可以作为分隔符,那个字符串替换是多余的。- @echo off
- for %%i in (192.168.1.1,192.168.1.12) do (
- echo %%i
- )
复制代码
作者: 522235677 时间: 2014-3-14 11:39
回复 20# lky216
在我这都可以,找找你自己的问题
作者: 522235677 时间: 2014-3-14 11:40
回复 21# DAIC
是哦,没想起,从来不用逗号来分割
作者: zhanglei1371 时间: 2014-3-14 14:15
回复 13# terse
这里用
echo %str:,=^
%
为何不行?
作者: terse 时间: 2014-3-14 15:43
回复 24# zhanglei1371
开启延迟变量 setlocal enabledelayedexpansion
用复制代码
作者: terse 时间: 2014-3-14 15:46
回复 16# lky216
我这里测试可以的 确定 “,”和“,” 的区别
作者: apang 时间: 2014-3-14 16:27
回复 24# zhanglei1371
如果不开启变量延迟,有一种办法:
http://bathome.l3.wuyou.com/thread-20262-1-1.html
作者: zhanglei1371 时间: 2014-3-14 16:39
回复 27# apang
谢谢,可否解释下含义,看了长时间没看明白
作者: apang 时间: 2014-3-14 19:35
回复 28# zhanglei1371
如果要从字串 ab 中间换行,分成两行显示,可以这样:- @echo off
- echo,a^
-
- b
- pause
复制代码
如果把它用变量表示,就是这样:- @echo off
- set NLM=^
-
-
- echo,a^%NLM%%NLM%b
- pause
复制代码
其中的 ^%NLM%%NLM% 代表的是换行,这是第一次转义。
如果再把^%NLM%%NLM%用一个变量表示,还需要再次转义,就成这样子了:- @echo off
- set NLM=^
-
-
- set NL=^^^%NLM%%NLM%^%NLM%%NLM%
- echo,a%NL%b
- pause
复制代码
作者: tom1 时间: 2014-3-16 10:20
这个系列语句好像可以在《for语句入门到精通》中找到
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |