Поиск повторяющихся псевдонимов и функций в скрипте (.bashrc и т. д.)

Для этого удобен Perl. :Переключатель -0777 будет поглощать весь файл в одну строку

perl -0777 -ne '
   s/-\n//g;                  # join the hyphenated words
   $count{$_}++ for split;    # count all the words
   while (($k,$v) = each %count) {print "$k:$v\n"}
' file
world:2
helo:1
hello:2
words:2
test:2

Вывод будет произвольным.


А вот еще более непонятный:. В tclsh нет хорошей опции -e, как в других языках, так что один лайнер -требует больше работы. Преимущество этого в том, что порядок слов в файле сохраняется.

echo '
    set fh [open [lindex $argv 1] r]
    set data [read -nonewline $fh]
    close $fh
    foreach word [split [string map {"-\n" ""} $data]] {
        dict incr count $word
    }
    dict for {k v} $count {puts "$k:$v"}
' | tclsh -- file
hello:2
world:2
test:2
helo:1
words:2

0
16.10.2021, 08:56
1 ответ

Простой grep для поиска определений, но без проверки переопределений:

$ grep -onE 'alias [[:alnum:]_]+=|[[:alnum:]_]+\(\)'.bashrc.aliases
.bashrc:47:alias foo=
.bashrc:47:alias bar=
.bashrc:49:asfdasdf()
.aliases:3:alias ls=
.aliases:6:alias foo=

Этот лайнер Perl one -ведет счет, поэтому он может помечать переопределения:

$ perl -lne 'while( /alias (\w+)=|(\w+)\(\)/g ) { 
                 $name = $1 // $2; $count{$name} += 1; 
                 printf "\"%s\" %s in %s line %s%s\n", $name, $count{$name} > 1 ? "REDEFINED" : "defined", $ARGV, $. 
             }'.bashrc.aliases 
"foo" defined in.bashrc line 47
"bar" defined in.bashrc line 47
"asfdasdf" defined in.bashrc line 49
"ls" defined in.aliases line 53
"foo" REDEFINED in.aliases line 56

(Порядок входных файлов влияет на то, какой из них не помечен как «переопределение».)

1
17.10.2021, 08:42

Теги

Похожие вопросы