如何在文件的所有行之前插入逗号,但是在一行和最后一个单词中插入逗号?

时间:2017-10-17 08:17:23

标签: windows batch-file

我想要一个批处理脚本在文件的所有行中插入逗号,但最后只有一个单词,最后只有一个单词和最后一个单词。逗号应该替换单词之间的空格。

E.g。测试文件:

This is first line
This is the second line
Check Subsystem version 3.1.8-11P

我希望输出看起来像:

This is,first,line
This is the,second,line
Check Subsystem,version,3.1.8-11P

这个脚本在最后一个单词之前插入逗号,但我和&之间有一行。并删除该行与&其中的符号。

E.g。 创建&删除版本1.1.1

此行已被删除。

@echo off
for /f usebackq^ delims^=^ eol^= %%A in ("Doc.txt") do (
    set "s=%%A"
    set "s1=%%A"
    setlocal enableDelayedExpansion
    set "s=!s:@=@a!"
    set "s=!s:\=@b!"
    set "s=!s:/=@f!"
    set "s=!s:.=@d!"
    set "s=!s: =.!"
    for /f "delims=" %%A in (".!s!") do (
        endlocal
        set "s=%%~xA"
        setlocal enableDelayedExpansion
        if defined s (
            set "s=!s:.= !"
            set "s=!s:@d=.!"
            set "s=!s:@f=/!"
            set "s=!s:@b=\!"
            set "s=!s:@a=@!"
            set "s=!s:~1!"
            call set s2=%%s1:!s!=%%
            echo !s2!,!s! >> output.txt
        )
        endlocal
    )
)
pause

而且我也不确定如何将逗号插入到最后但只有一个单词。

1 个答案:

答案 0 :(得分:1)

通过搜索
,支持正则表达式的任何文本编辑器都可以轻松完成 \W+(\w+)\W+(\w+)$并使用替换字符串,$1,$2

How can you find and replace text in a file using the Windows command-line environment?在一个答案中包含指向 Dave Benham 编写的JREPL.BAT的最新版本的链接,这使得可以使用正则表达式对文件进行此修改搜索和替换字符串。

在批处理文件中使用 JREPL.BAT ,并将此附加批处理文件放在与执行的批处理文件相同的目录中:

call "%~dp0jrepl.bat" "\W+(\w+)\W+(\w+)$" ",$1,$2" /F "%~1" /O -

"%~1"在此通用命令行中引用要修改的文件的名称。

运行jrepl.bat /?以获取有关此处使用的其他选项的帮助。

运行call /?以获取有关此命令的帮助和%~dp0的说明(当前批处理文件的驱动器和路径以反斜杠结尾)。

正则表达式替换的说明:

  • \W+ ...根据Unicode标准找到1个或多个非单词字符。
  • (\w+) ...根据Unicode标准找到1个或多个 word 字符,并在替换字符串中用$1标记找到的字符串以进行反向引用。
  • \W+ ...根据Unicode标准再次找到1个或多个非单词字符。
  • (\w+) ...根据Unicode标准再次找到1个或多个 word 字符,并在替换字符串中使用$2标记找到的字符串以进行反向引用。
  • $ ...只有在行尾可以找到两个单词时,搜索表达式才会产生正匹配,从而不会匹配换行符。

对于像

这样的行
Check Subsystem version 3.1.8-11P

应修改为

Check Subsystem,version,3.1.8-11P
根据Unicode标准,

在文件中需要使用不同的正则表达式搜索字符串,因为.-非单词字符。

必须将搜索字符串修改为:[^\w.\-]+([\w.\-]+)[^\w.\-]+([\w.\-]+)$

[ ... ]是正字符类定义,匹配方括号内指定的任何字符。

[^ ... ]是一个负字符类定义,匹配方括号中指定的任何字符

\w是根据Unicode标准对所有单词字符的特殊字符类定义。

正面或负面字符类定义的方括号内的

.被解释为文字字符。 dot字符在字符类定义之外的正则表达式搜索字符串中具有特殊含义。

正面或负面字符类定义的方括号内的

-表示所有字符字符X指定为- 字符Y根据字符X和Y的代码值指定-的权限。如果字符类中的-左侧或右侧没有字符,则hyphen也被解释为文字字符定义。但是,当连字符应被解释为文字字符时,建议在字符类定义中使用反斜杠转义-,而不考虑其在括号内的位置。在字符类定义之外,连字符没有特殊含义。

因此,用于包含带点和连字符的字符串的文件的整个命令行应该被解释为“单词”:

call "%~dp0jrepl.bat" "[^\w.\-]+([\w.\-]+)[^\w.\-]+([\w.\-]+)$" ",$1,$2" /F "%~1" /O -