我正在努力清理Windows机器上的几百个文件,我需要做的一件事就是删除一些重复的行。因此,示例文件可能如下所示:
foo=false
bar=true
baz=false
baz=false
baz=false
因此,在使用sed
时,我遇到this site,其中展示了一条删除重复行的行。
sed "$!N; /^\(.*\)\n\1$/!P; D" textfile.txt
所以我把它插入命令窗口,查看它是否有效,控制台窗口显示删除了重复的行。之后,我将该行插入我的批处理脚本,以便根据需要编辑的文件列表运行它。
FOR /F %%a IN ('listfile.txt') DO (
sed "$!N; /^\(.*\)\n\1$/!P; D" %%a
)
但是当我针对我的文件测试列表运行它时,它删除了文件中的每一行,除了一个重复的行。
我不熟悉sed
足以确定线路正在做什么,但我对它的测试表明它正在做我想做的事情。什么给出了什么?我错过了sed
在批处理文件中工作的方式吗?
根据我尝试的评论:
gawk "!a[$0]++" textfile.txt
再次在命令行上运行,但在脚本中不运行。因此,批处理文件运行此命令的方式肯定存在一些问题,但我无法弄清楚它是什么。
答案 0 :(得分:1)
在Windows平台上,使用PowerShell很简单:
get-content "textfile.txt" | sort-object -unique
比尔
答案 1 :(得分:1)
在对原始sed
语句进行更多测试后,我发现它已挂在命令中的!
上。所以我开始沿着这条路线进行挖掘,发现EnableDelyedExpansion
导致!
,即使在sed
语句中,也会删除它们之间的所有内容。
所以我的选择是逃避!
或缩小EnableDelayedExpansion
的范围。由于转义似乎没有起作用,我只是将范围缩小到需要它的特定变量的右边,然后sed
语句似乎在此之后正常工作。