我想创建一个批处理文件,该文件将读取包含类似文本的txt文件(它将全部在1行):
"http://schemas.google.com/g/2005#event"}],"title":{"$t":"Test Begins","type":"text"},"content":{"$t":"","type":"text"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid=XzhkOWxjZ3JmZHByNmFzams2MWhtNGU5azY4c200cDfr45yxN65kYjE2cGhqNGMxbDY4cjNjZWIxYzhwamNlMzE2Z28wIGFkbWluQGJodWpkaGFtLm9yZw","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/admin%40test.org/public/full/_8d9lcgrfdpr6asjk61hm4e9k68sm4p336oq62db16phj4c1l63erceb1c8pjce316go0"}],"author":[{"name":{"$t":"admin@test.org"},"email":{"$t":"admin@test.org"}}],"gd$comments":{"gd$feedLink":{"href":"http://www.google.com/calendar/feeds/admin%40test.org/public/full/_8d9lcgrfdpr6asjk61hm4e9k68sm4p336oq62db16phj4c1l68r3ceb1c8pjce316go0/comments"}},"gd$eventStatus":{"value":"http://schemas.google.com/g/2005#event.confirmed"},"gd$where":[{"valueString":""}],"gd$who":[{"email":"admin@test.org","rel":"http://schemas.google.com/g/2005#event.organizer","valueString":"admin@test.org"}],"gd$when":[{"endTime":"2014-01-17","startTime":"2014-01-16"}],"gd$transparency":{"value":"http://schemas.google.com/g/2005#event.opaque"},"gCal$anyoneCanAddSelf":{"value":"false"},"gCal$guestsCanInviteOthers":{"value":"true"},"gCal$guestsCanModify":{"value":"false"},"gCal$guestsCanSeeGuests":{"value":"true"},"gCal$sequence":{"value":0},"gCal$uid":{"value":"CSVConvert0cb9429bdc64a5a6c2052669ab368a40"}},{"id":{"$t":"http://www.google.com/calendar/feeds/admin%40test.org/public/full/_8d9lcgrfdpr6asjk6hh3gphjccpmaphg6opj0d316sq34cj570p3ic1j6grj4opgcoog"},"published":{"$t":"1900-01-01T12:00:00.000Z"},"updated":{"$t":"2013-08-20T11:13:33.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":
以上是这种文本块的一个实例的示例,真实文件可能有多个这样的块。
我想要做的是让批处理脚本读取文件,当它找到" title":{" $ t":" Test Begins& #34;,"输入":"文字"} 我想测试开始(在上面的示例中,但它可能是真实文件)存储在变量中。
脚本应该继续阅读文本文件util它遇到"," startTime":" 2014-01-16"}],&#34 ; gd $ transparency" 在这里我希望将日期存储到变量中。
现在我们有了第一对变量,我希望它们以下列格式写入文本文件:
[date] [text]
它一直这样做,直到它到达正在读取的文件的末尾。
我一直在为此而奋斗几天,我通常喜欢在没有人讨厌的情况下学习它,但我无法理解这一点。
非常感谢您的帮助。
答案 0 :(得分:1)
批处理不是解决此问题的好方法,因为它通常无法处理超过8191个字符的字符串,并且您的问题看起来很容易超出该限制。
一个好的选择是某种正则表达式处理器。一个Windows端口的sed或awk可能会做得很好。那里有免费版本。
我写过REPL.BAT - a hybrid JScript/batch utility that performs a regex search and replace on stdin and writes the result to stdout。它是纯脚本,可以在XP前面的任何现代Windows机器上运行,无需任何第三方可执行文件。完整的文档嵌入在脚本中。
假设REPL.BAT位于您当前的目录中,或者更好,在PATH中的某个位置,以下应该可以解决问题。
@echo off
setlocal
set "search=.*?\qtitle\q:{\q\$t\q:\q(.*?)\q,\qtype\q:\qtext\q}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q"
type "input.txt" | repl "%search%" "$&\r\n" x | repl "%search%" "[$2][$1]" xa >"output.txt"
我最后使用REPL两次,首先在每个块的末尾插入一个新行,然后第二次从每个结果行中提取值。似乎应该有一步到位的解决方案,但我无法弄明白。
更新以回复评论
我也写过getTimeStamp.bat - a hybrid JScript/batch utility to compute and format date and time information。假设getTimeStamp.bat位于当前目录或PATH中,则以下内容将提供您所需的格式。
@echo off
setlocal
set "search=.*?\qtitle\q:{\q\$t\q:\q(.*?)\q,\qtype\q:\qtext\q}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q"
>"output.txt" (
for /f "tokens=1,2 delims=[]" %%A in (
'type "input.txt" ^| repl "%search%" "$&\r\n" x ^| repl "%search%" "[$1][$2]" xa'
) do (
set "txt=%%A"
set "dt=%%B"
setlocal enableDelayedExpansion
call getTimeStamp -d "'!dt:-=/!'" -f "{wkd} {dd} {mth}" -r dt
echo [!dt!][!txt!]
endlocal
)
)
针对已删除的评论的最终更新
我添加了一个额外的REPL来删除最初的"title":{"$t":"Unwanted Text","type":"text"}
@echo off
setlocal
set "skipSearch=\qtitle\q:\{\q\$t\q:\q.*?\q,\qtype\q:\qtext\q\}((\s|\S)*)"
set "search=.*?\qtitle\q:\{\q\$t\q:\q(.*?)\q,\qtype\q:\qtext\q\}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q"
>"output.txt" (
for /f "tokens=1,2 delims=[]" %%A in (
'type "input.txt" ^| repl "%skipSearch%" "$1" mx ^| repl "%search%" "$&\r\n" x ^| repl "%search%" "[$1][$2]" xa'
) do (
set "txt=%%A"
set "dt=%%B"
setlocal enableDelayedExpansion
call getTimeStamp -d "'!dt:-=/!'" -f "{wkd} {dd} {mth}" -r dt
echo [!dt!][!txt!]
endlocal
)
)
另一个选项,假设“日历”永远不是一个值,应该总是被丢弃,是使用负向前瞻功能来防止匹配日历。
@echo off
setlocal
set "search=.*?\qtitle\q:\{\q\$t\q:\q(?!Calendar\q)(.*?)\q,\qtype\q:\qtext\q\}.*?\q,\qstartTime\q:\q(.*?)\q}],\qgd\$transparency\q"
>"output.txt" (
for /f "tokens=1,2 delims=[]" %%A in (
'type "input.txt" ^| repl "%search%" "$&\r\n" x ^| repl "%search%" "[$1][$2]" xa'
) do (
set "txt=%%A"
set "dt=%%B"
setlocal enableDelayedExpansion
call getTimeStamp -d "'!dt:-=/!'" -f "{wkd} {dd} {mth}" -r dt
echo [!dt!][!txt!]
endlocal
)
)