Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 批量将一行文本拆分为多行,由引号空间引号分隔_Regex_Windows_Batch File_Cmd - Fatal编程技术网

Regex 批量将一行文本拆分为多行,由引号空间引号分隔

Regex 批量将一行文本拆分为多行,由引号空间引号分隔,regex,windows,batch-file,cmd,Regex,Windows,Batch File,Cmd,提前谢谢 使用DOS批处理文件,我试图读取一个文本文件,其中包含多个带引号的完整路径,用空格分隔,然后写入一个新文件,每行包含一个路径 例如,我要打开此文件: "C:\path\filename.doc" "C:\path\filename.doc" "C:\path\filename.doc" "C:\path\filename.doc" 为此: "C:\path\filename.doc" "C:\path\filename.doc" "C:\path\filename.doc" "C:\

提前谢谢

使用DOS批处理文件,我试图读取一个文本文件,其中包含多个带引号的完整路径,用空格分隔,然后写入一个新文件,每行包含一个路径

例如,我要打开此文件:

"C:\path\filename.doc" "C:\path\filename.doc" "C:\path\filename.doc" "C:\path\filename.doc"
为此:

"C:\path\filename.doc"
"C:\path\filename.doc"
"C:\path\filename.doc"
"C:\path\filename.doc"
我已经使用了一些成功的精彩

但是当文件名或路径中有空格时,它会在路径中间折断一条新的线,并将其销毁。 我尝试了使用转义字符

^
作为搜索变量传递到repl,即
repl“^”^“
和其他方式,但没有任何乐趣


最后,我只需将所有文件移到另一个目录中,然后将生成的文本文件传递给另一个批量删除批处理文件进行处理,但是,也许有一种更好的方法我丢失了?

您可以使用下面的批处理文件
split.bat
,将文本文件的内容重定向到其中,并将输出重定向到另一个文件,如
split.batnewfiles.txt

@echo off
set /P INFILE=
call :SPLIT %INFILE%
exit /B

:SPLIT
shift
if "%~0"=="" exit /B
echo "%~0"
goto :SPLIT
如果未提供输入文件(
),脚本将提示您输入一个空格分隔的列表。
如果没有给出输出文件(
>newfiles.txt
),屏幕上将显示创建的新行分隔列表

请注意,这不会验证输入文件是否符合所述格式


此方法被限制为1021字节(字符)的列表长度,之后的所有内容都将被截断

您可以使用以下批处理文件
split.bat
并调用它,将文本文件的内容重定向到其中,并将输出重定向到另一个文件,如
split.batnewfiles.txt

@echo off
set /P INFILE=
call :SPLIT %INFILE%
exit /B

:SPLIT
shift
if "%~0"=="" exit /B
echo "%~0"
goto :SPLIT
如果未提供输入文件(
),脚本将提示您输入一个空格分隔的列表。
如果没有给出输出文件(
>newfiles.txt
),屏幕上将显示创建的新行分隔列表

请注意,这不会验证输入文件是否符合所述格式


此方法被限制为1021字节(字符)的列表长度,之后的所有内容都将被截断

假设您可以保证每个文件路径都包含在双引号中,那么您只需要稍微调整一下REPL.BAT命令:

type "files.txt" | repl "(\q.*?\q) *" "$1\r\n" x >"newfile.txt"    
但是REPL.BAT已经被取代了,它有更多的功能,语法也略有不同

JREPL解决方案可以简单到:

jrepl "\q.*?\q" $0 /x /jmatch /f file.txt /o newfile.txt
如果需要,可以通过指定
-
作为输出文件,用结果覆盖原始文件

jrepl "\q.*?\q" $0 /x /jmatch /f file.txt /o -

如果原始文件中的每一行都假设您可以保证每个文件路径都包含在双引号中,那么您只需要稍微调整REPL.BAT命令:

type "files.txt" | repl "(\q.*?\q) *" "$1\r\n" x >"newfile.txt"    
但是REPL.BAT已经被取代了,它有更多的功能,语法也略有不同

JREPL解决方案可以简单到:

jrepl "\q.*?\q" $0 /x /jmatch /f file.txt /o newfile.txt
如果需要,可以通过指定
-
作为输出文件,用结果覆盖原始文件

jrepl "\q.*?\q" $0 /x /jmatch /f file.txt /o -

如果原始文件中的每一行都,则该行的长度有一个限制,约为8KB

如果小于该值,则会将文件移动到新文件夹中

@echo off
for /f "usebackq delims=" %%a in ("c:\folder\file.txt") do (
   for %%b in (%%a) do move "%%~b" "d:\existing\new\folder"
)
下面的代码可以将除列表中的文件外的所有文件移入

它将向列表中的文件添加隐藏属性,移动所有其他文件,然后再次删除隐藏属性

@echo off
for /f "usebackq delims=" %%a in ("c:\folder\file.txt") do (
   for %%b in (%%a) do attrib +h "%%~b"
)
cd /d "c:\folder"
move *.* "d:\already\existing folder"
for /f "usebackq delims=" %%a in ("c:\folder\file.txt") do (
   for %%b in (%%a) do attrib -h "%%~b"
)
评论中提到的Windows 2012测试代码

@echo off
(echo "c:\widget1\test 1.txt" "2:\widget2\test 2.doc")>"file.txt"

for /f "usebackq delims=" %%a in ("file.txt") do (
   for %%b in (%%a) do echo move "%%~b" "d:\existing\new\folder"
)
pause

这对行的长度有一个限制,约为8KB

如果小于该值,则会将文件移动到新文件夹中

@echo off
for /f "usebackq delims=" %%a in ("c:\folder\file.txt") do (
   for %%b in (%%a) do move "%%~b" "d:\existing\new\folder"
)
下面的代码可以将除列表中的文件外的所有文件移入

它将向列表中的文件添加隐藏属性,移动所有其他文件,然后再次删除隐藏属性

@echo off
for /f "usebackq delims=" %%a in ("c:\folder\file.txt") do (
   for %%b in (%%a) do attrib +h "%%~b"
)
cd /d "c:\folder"
move *.* "d:\already\existing folder"
for /f "usebackq delims=" %%a in ("c:\folder\file.txt") do (
   for %%b in (%%a) do attrib -h "%%~b"
)
评论中提到的Windows 2012测试代码

@echo off
(echo "c:\widget1\test 1.txt" "2:\widget2\test 2.doc")>"file.txt"

for /f "usebackq delims=" %%a in ("file.txt") do (
   for %%b in (%%a) do echo move "%%~b" "d:\existing\new\folder"
)
pause

如果原始行长度超过1021字节,则此操作将失败。如果原始行长度超过1021字节,则此操作将失败。编辑-我忘记了
\q
转义序列需要
/X
选项。我尝试使用\q和X选项,但缺少。*?因为我不理解选择是如何应用的。Cheers我的输入文件在某些情况下会相当长,有时会超过8KB,但我的测试在大小为866bytes或windows报告的4KB时失败,并出现Jscript错误“Jscript runtime Error in Replace code:Invalid procedure call or argument”(替换代码中的Jscript运行时错误:无效的过程调用或参数),但是当它在非常短的测试示例中运行时,输出中的每个字符都有一个空格。编辑-我忘记了
\q
转义序列需要
/X
选项。我尝试过使用\q和X选项,但缺少。*?因为我不理解选择是如何应用的。Cheers我的输入文件在某些情况下会相当长,有时会超过8KB,但我的测试在大小为866bytes或windows报告的4KB时失败,并出现Jscript错误“Jscript runtime Error in Replace code:Invalid procedure call or argument”(替换代码中的Jscript运行时错误:无效的过程调用或参数),但是当它在非常短的测试示例中运行时,输出中的每个字符都有一个空格。是的,每行都应该小于8k,这非常有效。谢谢!)我实际上需要移动目录中的所有文件,执行file.txt中的文件,所以我要将所有这些文件移动到一个目录中,删除剩余的文件,然后将它们移回。在没有双重处理的情况下,是否可以删除?屏幕上的错误消息是什么?拒绝访问?我认为超过8KB的较长线路的同样问题阻止了此功能的正常运行