Мне нужно изменить файл в сценарии ksh, используя sed, но не все строки? - PullRequest
1 голос
/ 30 мая 2019

У меня есть файл .pc (Pro c), у которого есть некоторые проблемы с совместимостью с linux при передаче из windows. Поэтому я попытался создать скрипт для формализации документа в нужном мне формате, но я столкнулся с проблемой с подстановкой комментариев //. Проблема:
Мне нужно заменить все комментарии, которые начинаются с // на /* */ комментариев Я уже сделал это, но у меня есть простая проблема, в некоторых файлах у меня есть // комментариев в /* */ комментариев, как в примере ниже:

/*

// some comments
code;
code;

*/

Итак, когда я пошел заменить это сценарием, это выглядит так:

/*

/* some comments */
code;
code;

*/

Но последний */ отцовских комментариев дает мне ошибку, потому что не может быть двух */ сцепленных, поэтому последний */ дает мне ошибку.

Мне нужно заменить только комментарии, которые не только в /* */ комментарии и замените // внутри них одним /*

for file in $(ls $path)    
do         
sed -i -e '/\/\// s/$/ *\//g' -e 's/\/\//\/* /g' $path/file       
done    

1 Ответ

1 голос
/ 31 мая 2019

Этот сценарий Perl должен выполнять работу для каждого файла, который он получает в качестве параметра.

use v5.10;
for my $file (@ARGV) {
    -f $file or warn "$file is not a plain file, ignoring..." and next;
    open my $fh, '<', $file;
    my @content = <$fh>;
    close $fh;
    my $comment = 0;
    for (keys @content) {
        $comment or $content[$_] =~ /\/\*/ and $comment = 1;
        $comment and $content[$_] =~ /\*\// and $comment = 0;
        $comment or $content[$_] =~ s/\/\/\s*(.*?)\s*$/\/\* $1 \*\// and $content[$_].="\n";
    }
    open $fh, '>', $file;
    print $fh @content;
    close $fh;
}

Для его выполнения вставьте содержимое в файл и запишите в командной строке ksh.

perl <name_of_script>.pl <files>
...