我希望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
中表达这一点。
答案 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将换行符转换回空格。
虽然在手机上打字,但无法给出确切的命令:(