sed脚本删除文件名重复

时间:2010-05-19 16:43:05

标签: linux sed

我希望sed爱好者能够轻松完成以下任务。我不是sed - guru,但我需要在sed中表达以下任务,因为sed在Linux系统上更受欢迎。

输入文本流是由“make depends”生成的,如下所示:

pgm2asc.o: pgm2asc.c ../include/config.h amiga.h list.h pgm2asc.h pnm.h \
 output.h gocr.h unicode.h ocr1.h ocr0.h otsu.h barcode.h progress.h
box.o: box.c gocr.h pnm.h ../include/config.h unicode.h list.h pgm2asc.h \
 output.h
database.o: database.c gocr.h pnm.h ../include/config.h unicode.h list.h \
 pgm2asc.h output.h
detect.o: detect.c pgm2asc.h pnm.h ../include/config.h output.h gocr.h \
 unicode.h list.h

我只需要捕获C ++头文件(即以.h结尾),使列表唯一并打印为以src/作为路径前缀的空格分隔列表。这是通过以下perl脚本实现的:

make libs-depends | perl -e 'while (<>) { while (/ ([\w\.\/]+?\.h)/g) { $a{$1} = 1; } } print join " ", map { "src/$_" } keys %a;'

输出结果为:

src/unicode.h src/pnm.h src/progress.h src/amiga.h src/ocr0.h src/ocr1.h src/otsu.h src/barcode.h src/gocr.h src/../include/config.h src/list.h src/pgm2asc.h src/output.h

请帮助在sed中表达这一点。

3 个答案:

答案 0 :(得分:2)

没有sed,但希望这可以帮助你:

make libs-depends | grep -io --perl-regexp "[\w\.\/]+\.h " | sort -u | sed -e 's:^:src/:' 

答案 1 :(得分:1)

如果你真的想在纯sed中这样做:

make libs-depends | sed 's/ /\n/g' | sed '/\.h$/!d;s/^/src\//' | sed 'G;/^\(.*\)\n.*\1/!h;$!d;${x;s/\n/ /g}'

第一个sed命令将输出分解为单独的行,第二个命令除了* .h和prepends'src /'之外的所有内容,第三个将这些行重叠在一起而不重复。

答案 2 :(得分:0)

Sed可能不是最好的工具,因为它是面向流的。您可以使用它将空格转换为换行符,通过sort和uniq管道,然后再次使用sed将换行符转换回空格。

虽然在手机上打字,但无法给出确切的命令:(