Board logo

标题: [文本处理] [已解决]bat把字符替换为换行时为何丢失内容 [打印本页]

作者: lyc309    时间: 2011-12-9 15:48     标题: [已解决]bat把字符替换为换行时为何丢失内容

本帖最后由 lyc309 于 2011-12-10 12:01 编辑
$a 2011年11月30日晚,中国人民银行决定,自12月5日起下调金融机构存款准备金率0.5个百分点,这是央行自2008年12月25日以来首次下调存款准备金率,调整时间点略早于我们之前的预期。在此之前,央行已连续12次上调存款准备金率,大型金融机构存款准备金率达到21.5%的历史高位。那么,本次下调存款准备金的原因何在?对未来的钢材市场有何影响?本文将结合当前宏观经济形势对此进行简要分析。$a$a一、本次下调存款准备金的原因分析$a$a1.欧洲主权债务危机加剧,新兴经济体资本流出压力加大。近期欧洲主权债务风险进一步加剧,意大利和西班牙国债收益率相继突破7%,导致全球资金出于避险需要回流美元和美元资产的趋势进一步加强,这对于各国家尤其是新兴经济体的市场将会产生重要影响。自9月份以来,为应对欧美经济下滑带来的影响,主要新兴经济体开始了新一轮的宽松货币政策。本月初,澳大利亚进行了金融危机以来的首次降息;此外,巴西、印尼、新加坡和泰国近期不约而同的采取降息措施。

条件:想把$a替换为换行,在翻找以前的帖子的时候找到hanyeguxing大的:
  1. @echo off
  2. (for /F "delims=" %%a in (1.txt) do ( set a=%%a
  3. setlocal enabledelayedexpansion
  4. set "a=!a:<a=&echo.!"&call:a "!a!"
  5. Endlocal))>2.txt
  6. exit
  7. :a
  8. echo.%~1
复制代码
把之改为:
  1. @echo off
  2. (for /F "delims=" %%a in (1.txt) do ( set a=%%a
  3. setlocal enabledelayedexpansion
  4. set "a=!a:$a=&echo.!"&call:a "!a!"
  5. Endlocal))>2.txt
  6. exit
  7. :a
  8. echo.%~1
复制代码
但是得出来的却是删减版的,中间一小段文字给删除了
2011年11月30日晚,中国人民银行决定,自12月5日起下调金融机构存款准备金率0.5个百分点,这是央行自2008年12月25日以来首次下调存款准备金率,调整时间点略早于我们之前的预期。在此之前,央行已连续12次上调存款准备金率,大型金融机构存款准备金率达到21.5,导致全球资金出于避险需要回流美元和美元资产的趋势进一步加强,这对于各国家尤其是新兴经济体的市场将会产生重要影响。自9月份以来,为应对欧美经济下滑带来的影响,主要新兴经济体开始了新一轮的宽松货币政策。本月初,澳大利亚进行了金融危机以来的首次降息;此外,巴西、印尼、新加坡和泰国近期不约而同的采取降息措施。

超级新手,不知道怎么回事,还有很奇怪的把文中的百分号给删了。其他文本处理倒没什么问题。
说下要处理文字的环境,$a的符号可以替换其他的符号,需要的是把$a替换为换行,形式如:
2011年11月30日晚,中国人民银行决定,自12月5日起下调金融机构存款准备金率0.5个百分点,这是央行自2008年12月25日以来首次下调存款准备金率,调整时间点略早于我们之前的预期。在此之前,央行已连续12次上调存款准备金率,大型金融机构存款准备金率达到21.5%的历史高位。那么,本次下调存款准备金的原因何在?对未来的钢材市场有何影响?本文将结合当前宏观经济形势对此进行简要分析。
一、本次下调存款准备金的原因分析
1.欧洲主权债务危机加剧,新兴经济体资本流出压力加大。近期欧洲主权债务风险进一步加剧,意大利和西班牙国债收益率相继突破7%,导致全球资金出于避险需要回流美元和美元资产的趋势进一步加强,这对于各国家尤其是新兴经济体的市场将会产生重要影响。自9月份以来,为应对欧美经济下滑带来的影响,主要新兴经济体开始了新一轮的宽松货币政策。本月初,澳大利亚进行了金融危机以来的首次降息;此外,巴西、印尼、新加坡和泰国近期不约而同的采取降息措施。

_____________________________________________________分割线_______________________________
论坛的问答对于新手来说是个大障碍呀,都把代码复制到bat里面运行了,得出来的结果都不对。
  1. set a=home.cmd&call echo %a:*o=%
复制代码
答案是什么,运行后得到的*o=居然不对(还在看for命令,见笑了)
在这里感谢C版,运行后暂时没什么问题,不知道用的时候有什么缺点呢,awk大大的就不测试了,与第三方软件相比,bat真坑爹呀,不过bat比较易普及!虽然用不着,但是依然感谢awk大大。
最后,能解释下为什么会出现内容会丢失吗?
作者: CrLf    时间: 2011-12-9 15:56

本帖最后由 CrLf 于 2011-12-10 15:32 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set hh=^
  3. (for %%A in ("!hh!") do (
  4.    endlocal
  5.    for /f "delims=" %%a in (1.txt) do (
  6.       set str=%%a
  7.       setlocal enabledelayedexpansion
  8.       for /f "delims=" %%b in ("!str:$a=%%~A!") do (
  9.          if defined str endlocal
  10.          echo;%%b
  11.       )
  12.       if defined str endlocal
  13.    )
  14. ))>2.txt
复制代码

作者: awk    时间: 2011-12-9 16:00

  1. sed "s/$a/\n/g" a.txt >b.txt
复制代码

作者: Demon    时间: 2011-12-9 16:19

  1. @echo off&mshta "javascript:(new ActiveXObject('scripting.filesystemobject')).OpenTextFile('2.txt',2,true).Write((new ActiveXObject('scripting.filesystemobject')).OpenTextFile('1.txt').ReadAll().replace(/\$a/gi,'\r\n'));window.close();"&pause
复制代码

作者: CrLf    时间: 2011-12-9 16:30

回复 3# awk


回复 4# Demon


    发现论坛果然越来越百花齐放了哈哈,各种有办法...
作者: lyc309    时间: 2011-12-9 16:39

本帖最后由 lyc309 于 2011-12-9 16:42 编辑
Demon 发表于 2011-12-9 16:19
awk 发表于 2011-12-9 16:00
CrLf 发表于 2011-12-9 15:56


回复一次,居然要百度一下。验证答案真不好搞呀,放入.bat运行居然结果还是错的。
set a=home.cmd&call echo %a:*o=%答案居然不是"*o=".
c版的运行没问题,awk大大的是sed吧,这个不容易普及。不过方法好简单呀。Demon大大的好像只能处理同一个目录下的文件吧,放在其他路径会出错。
最后,能解释下为什么会出现内容会丢失吗?
最后谢谢大家帮助!
作者: lyc309    时间: 2011-12-9 16:43

第一个原来是cmd里面运行的结果,怪不得。
作者: asnahu    时间: 2011-12-9 20:02

js在文本处理的优势还是比较明显的
作者: awk    时间: 2011-12-9 21:06

回复 6# lyc309


你用,我用,大家用,慢慢就普及了。
作者: CrLf    时间: 2011-12-10 15:29

至于楼主问为何会丢失字符的问题,是因为 call 有二次扩展的特性,会将一对 % 之间的内容当作变量名解析,如果不存在该变量名则解释为空




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