找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24022|回复: 13

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

[复制链接]
发表于 2021-11-3 08:27:54 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码
发表于 2021-11-3 08:43:59 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
5i365 + 1

查看全部评分

发表于 2021-11-3 08:58:18 | 显示全部楼层
按多个空格替换并分列。
 楼主| 发表于 2021-11-3 09:02:43 | 显示全部楼层
回复 3# qixiaobin0715


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

能用正则取出来吗?
发表于 2021-11-3 09:06:04 | 显示全部楼层
bat不支持正则替换。请求助第三方或其它程序及脚本。
发表于 2021-11-3 09:39:12 | 显示全部楼层
回复 4# 5i365


for命令的delims不支持【多个字母组成的字符串作为一个整体】做分隔符。
如果你确定列之间就是普通的空格而不是制表符或其他特殊空白字符,那么就用2楼的方案吧。
发表于 2021-11-3 09:46:30 | 显示全部楼层
本帖最后由 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. }
复制代码
 楼主| 发表于 2021-11-3 11:29:09 | 显示全部楼层
回复 6# Batcher


   要是能在cmd中简单的借力powershell能实现这个相同的效果就好了
发表于 2021-11-3 11:51:32 | 显示全部楼层
回复 8# 5i365


    你用WMIC获取到的这个信息,用PowerShell一样可以获取到。
 楼主| 发表于 2021-11-3 12:41:04 | 显示全部楼层
回复 9# Batcher


    试了一下, 用下面的代码可以取到, 但是怎样写成cmd代码?
  1. "Adobe PDF            Print          Adobe PDF" -match ".+\s.+Print"
  2. $matches[0] -replace '\s*Print', ""
复制代码
发表于 2021-11-3 13:04:56 | 显示全部楼层
  1. ("Adobe PDF            Print          Adobe PDF" -replace 'print.*$').Trim();
复制代码
为什么不直接用 Powershell So easy; PS 中那么多打印命令
 楼主| 发表于 2021-11-3 13:18:51 | 显示全部楼层
回复 11# xczxczxcz


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

powershell "& {('Adobe PDF            Print          Adobe PDF' -replace 'print.*$').Trim();}"
发表于 2021-11-3 14:55:26 | 显示全部楼层
回复 12# 5i365


    吃饱了撑的,整个过程都可在PS中完成,查询(查询过滤添加卸载安装驱动卸载驱动)到输入输出都在PS中,为什么要输出到BAT中。闲的没事干。
 楼主| 发表于 2021-11-3 15:40:05 | 显示全部楼层
回复 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 03:52 , Processed in 0.032161 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表