在TXT文件中找到“-”,然后在前后切换,反之亦然

时间:2018-07-15 12:49:33

标签: sorting batch-file find

我有一个文本文件,其中包含名为author.txt的作者排序的书籍清单。我想创建一个新列表,该列表由title.txt列表文件中的标题和作者author.txt排序。

author.txt在以下布局中是恒定的:“作者姓名”“空格”“连字符”“空格”“标题”。

这是节选:

Aaron James - Assholes--A Theory
Adam Grant - Originals_ How Non-Conformists Move the World
Adam Lashinsky - Inside Apple
Adam Penenberg - Viral Loop (Facebook to Twitter)
Adam Rothstein - The End of Money
Agatha Christie - And Then There Were None
Al Murray - Let's Re-Great Britain
Alan Dean Foster - The Dig
Alan Furst - Night Soldiers
Alan Glynn - Limitless
Alan Greenspan - The Map and the Territory
Alan Moore - V for vendetta
Alastair Reynolds - Century Rain

3 个答案:

答案 0 :(得分:2)

如果我理解正确,则希望将排序列表<author> - <title>转换为重新排序列表<title> - <author>。这是一种(目前未经测试!)纯批处理脚本方法,它基于以下假设:<author>部分不包含分隔符序列 SPACE + - + SPACE

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem //Define constants here:
set "_INFILE=author.txt"
set "_OUTFILE=title.txt"
set "_TMPFILE=%TEMP%\%~n0_%RANDOM%.tmp"
set "_SEP= - "
(set _NL=^
%= empty line =%
)

> "%_TMPFILE%" (
    for /F usebackq^ delims^=^ eol^= %%L in ("%_INFILE%") do (
        set "AUTHOR=" & set "LINE=%%L"
        setlocal EnableDelayedExpansion
        for /F delims^=^ eol^= %%T in ("!LINE:*%_SEP%=!") do (
            for /F delims^=^ eol^= %%A in (^"!LINE:%_SEP%^=^%_NL%%_NL%!^") do (
                endlocal
                if not defined AUTHOR (
                    set "AUTHOR=%%A"
                    set "TITLE=%%T"
                )
                setlocal EnableDelayedExpansion
            )
        )
        if defined AUTHOR echo(!TITLE!%_SEP%!AUTHOR!
        endlocal
    )
)
sort "%_TMPFILE%" /O "%_OUTFILE%"
del "%_TMPFILE%"

endlocal
exit /B

答案 1 :(得分:1)

下载由 Dave Benham 编写的JREPL.BAT,这是一个批处理文件/ JScript混合程序,可使用JScript在文件上运行正则表达式替换并将其存储在与以下批处理文件相同的目录中还包含author.txt

@echo off
if not exist "%~dp0jrepl.bat" goto :EOF
if not exist "author.txt" goto :EOF

call "%~dp0jrepl.bat" "^(.+) - (.+)$" "$2 - $1" /F "author.txt" | %SystemRoot%\System32\sort.exe /O "title.txt"

这里不需要命令 CALL ,因为重定向运算符|导致在完成 JREPL.BAT <后,该批处理文件上的批处理文件继续执行。 / strong>。但通常,必须使用命令 CALL 从批处理文件中运行另一个批处理文件,并在完成被调用的批处理文件(不包含命令{{1 }}(不带选项exit)。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • /B
  • call /?
  • echo /?
  • goto /?
  • sort /?

答案 2 :(得分:0)

对于perl实现:

open (my FILE,"<","author.txt"); # Provide complete path
@authorlist = <FILE>;
s/^(.+?)\s*?-\s*?(.+)\s*+$/$2 - $1/ or warn "Unable to match regex in line: $_\n" foreach (@authorlist);
print join("\n",@authorlist);

只需测试等效代码,即可正常工作。

摘录作为输入时获得的输出:

  

混蛋-理论-亚伦·詹姆斯
   Originals_不循规蹈矩的人如何移动世界-亚当·格兰特
   苹果内部-亚当·拉辛斯基
   病毒循环(Facebook到Twitter)-亚当·彭伯格
   金钱的尽头-亚当·罗斯斯坦
   然后什么都没有-阿加莎·克里斯蒂
   让我们重返大不列颠-阿尔·穆雷
   The Dig-艾伦·迪恩·福斯特
   暗夜士兵-艾伦·弗斯特
   无限-艾伦·格林(Alan Glynn)
   地图和领地-艾伦·格林斯潘
   V字仇杀队-艾伦·摩尔
   世纪雨-阿拉斯泰尔·雷诺兹

警告语句将有助于确定正则表达式失败的地方(如果有的话)。