Board logo

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

作者: 5i365    时间: 2021-11-3 08:27     标题: 用多个字母做分隔符,怎样去掉某列前或列后的空格

本帖最后由 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
复制代码

作者: qixiaobin0715    时间: 2021-11-3 08:43

本帖最后由 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
复制代码

作者: qixiaobin0715    时间: 2021-11-3 08:58

按多个空格替换并分列。
作者: 5i365    时间: 2021-11-3 09:02

回复 3# qixiaobin0715


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

能用正则取出来吗?
作者: qixiaobin0715    时间: 2021-11-3 09:06

bat不支持正则替换。请求助第三方或其它程序及脚本。
作者: Batcher    时间: 2021-11-3 09:39

回复 4# 5i365


for命令的delims不支持【多个字母组成的字符串作为一个整体】做分隔符。
如果你确定列之间就是普通的空格而不是制表符或其他特殊空白字符,那么就用2楼的方案吧。
作者: 523066680    时间: 2021-11-3 09:46

本帖最后由 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. }
复制代码

作者: 5i365    时间: 2021-11-3 11:29

回复 6# Batcher


   要是能在cmd中简单的借力powershell能实现这个相同的效果就好了
作者: Batcher    时间: 2021-11-3 11:51

回复 8# 5i365


    你用WMIC获取到的这个信息,用PowerShell一样可以获取到。
作者: 5i365    时间: 2021-11-3 12:41

回复 9# Batcher


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

作者: xczxczxcz    时间: 2021-11-3 13:04

  1. ("Adobe PDF            Print          Adobe PDF" -replace 'print.*$').Trim();
复制代码
为什么不直接用 Powershell So easy; PS 中那么多打印命令
作者: 5i365    时间: 2021-11-3 13:18

回复 11# xczxczxcz


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

powershell "& {('Adobe PDF            Print          Adobe PDF' -replace 'print.*$').Trim();}"
作者: xczxczxcz    时间: 2021-11-3 14:55

回复 12# 5i365


    吃饱了撑的,整个过程都可在PS中完成,查询(查询过滤添加卸载安装驱动卸载驱动)到输入输出都在PS中,为什么要输出到BAT中。闲的没事干。
作者: 5i365    时间: 2021-11-3 15:40

回复 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
复制代码





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