Сценарий sed для удаления дубликатов имен файлов - PullRequest
0 голосов
/ 19 мая 2010

Надеюсь, что следующее задание будет очень простым для любителей sed.Я не sed -гуру, но мне нужно выразить следующую задачу в sed, так как sed более популярен в системах Linux.

Поток входного текста - это то, что создается "make зависимость "и выглядит следующим образом:

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 ]

2 голосов
/ 19 мая 2010

Не сед, но надеюсь, что это поможет вам:

make libs-depends | grep -io --perl-regexp "[\w\.\/]+\.h " | sort -u | sed -e 's:^:src/:' 
1 голос
/ 19 мая 2010

Если вы действительно хотите сделать это в чистом виде:

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

Первая команда sed разбивает вывод на отдельные строки, вторая отфильтровывает все, кроме * .h, и добавляет «src /», третья объединяет строки без повторения.

0 голосов
/ 19 мая 2010

Sed, вероятно, не самый лучший инструмент, так как он ориентирован на поток. Вы можете использовать его для преобразования пробелов в символы новой строки, передавая их через sort и uniq, а затем снова используйте sed для преобразования строк в пробелы.

Однако, набрав это на моем телефоне, я не могу дать точные команды: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...