[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 用多个字母做分隔符,怎样去掉某列前或列后的空格

本帖最后由 5i365 于 2021-11-3 08:39 编辑

想取第一列或第三列的值, 想到了用多个字母做分隔符, 但是获取的值有空格,

另外还有更好的办法吗? 求高手支招, 感谢
  1. @echo off
  2. REM set "str=Adobe PDF            Print          Adobe PDF"
  3. REM set "str=Canon G1010 series   Print          Canon G1010 series"
  4. set "str=hp LaserJet 1010 HB  Print          hp LaserJet 1010 HB"
  5. set "str=%str:Print=#%"
  6. for /f "tokens=1,2 delims=#" %%a in ("%str%") do (
  7.     echo "%%a"
  8.     echo "%%b"
  9. )
  10. pause
复制代码

回复 13# xczxczxcz


    99%的已经完成的任务都用CMD代码搞定了, 为了这1%的任务, 全部推倒重来用Powvershell重搞? 你会这样搞? 那不是疯了,就是纯粹的吃饱了撑得!

经群里高人指点, 已经搞定了, 欢迎借鉴参考 :
  1. @echo off
  2. for /f "delims=" %%i in ('powershell "('Adobe PDF            Print          Adobe PDF' -replace 'print.*$').Trim();"') do (
  3. set ok=%%i
  4. )
  5. echo "%ok%"
  6. pause
复制代码

TOP

回复 12# 5i365


    吃饱了撑的,整个过程都可在PS中完成,查询(查询过滤添加卸载安装驱动卸载驱动)到输入输出都在PS中,为什么要输出到BAT中。闲的没事干。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 11# xczxczxcz


    感谢帮忙 怎样把下面的值赋给变量?

powershell "& {('Adobe PDF            Print          Adobe PDF' -replace 'print.*$').Trim();}"

TOP

  1. ("Adobe PDF            Print          Adobe PDF" -replace 'print.*$').Trim();
复制代码
为什么不直接用 Powershell So easy; PS 中那么多打印命令
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 9# Batcher


    试了一下, 用下面的代码可以取到, 但是怎样写成cmd代码?
  1. "Adobe PDF            Print          Adobe PDF" -match ".+\s.+Print"
  2. $matches[0] -replace '\s*Print', ""
复制代码

TOP

回复 8# 5i365


    你用WMIC获取到的这个信息,用PowerShell一样可以获取到。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher


   要是能在cmd中简单的借力powershell能实现这个相同的效果就好了

TOP

本帖最后由 523066680 于 2021-11-3 09:47 编辑

Perl方案一,在split时用正则做切割,在返回数组中取对应元素[0,2]
  1. my $str = <<PRN;
  2. Adobe PDF            Print          Adobe PDF
  3. Canon G1010 series   Print          Canon G1010 series
  4. hp LaserJet 1010 HB  Print          hp LaserJet 1010 HB
  5. PRN
  6. grep { printf "%s -> %s\n", (split / {2,}/)[0,2] } split /\r?\n/, $str;
复制代码
方案2,正则捕获
  1. while ( $str =~ /([\w ]+?)\s{2,}\w+\s{2,}([\w ]+?)$/gm )
  2. {
  3.     printf "$1, $2\n";
  4. }
复制代码

TOP

回复 4# 5i365


for命令的delims不支持【多个字母组成的字符串作为一个整体】做分隔符。
如果你确定列之间就是普通的空格而不是制表符或其他特殊空白字符,那么就用2楼的方案吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

bat不支持正则替换。请求助第三方或其它程序及脚本。

TOP

回复 3# qixiaobin0715


    感谢帮忙, 请问还有别的办法吗? 这方法不太直接

能用正则取出来吗?

TOP

按多个空格替换并分列。

TOP

本帖最后由 qixiaobin0715 于 2021-11-3 08:45 编辑
  1. @echo off
  2. set "str=Adobe PDF            Print          Adobe PDF"
  3. set "str=%str:  =#%"
  4. set "str=%str:# =#%"
  5. for /f "tokens=1,3 delims=#" %%a in ("%str%") do (
  6.     echo %%a
  7.     echo %%b
  8. )
  9. pause
复制代码
1

评分人数

TOP

返回列表