sed / find / grep добавить c # комментарий в начало файла, если его там нет, и заменить, если существует - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть пункт об авторских правах, который я хочу добавить в начало группы файлов в каталоге в качестве комментария (C #).Это выглядит следующим образом:

/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/
/*C Use, duplication, or disclosure of this software and        T*/
/*C related documentation is blah blah blah blah                T*/
/*C Copyright 2004 - 2018 COMPANY                               T*/
/*C All rights reserved.                                        T*/
/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/

Некоторые файлы уже содержат предложение, но с датой 2017 или 2016 г. я хочу убедиться, что дата в предложении установлена ​​на 2018. И еслинет никакого пункта, я хочу вставить один.

До сих пор я реализовал find для изменения только тех файлов, которые мне нужны в каталоге:

find . -type d \( -name ThirdParty -o -name 3rdParty -o -name 3rd_party \) -prune -o -type f \( -name "*.java" -o -name "*.cs" -o -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" -o -name "*.c" -o -name "*.h" -o -name "*.scala" -o -name "*.css" -o -name "*.js" \) -print0

Поскольку этот пункт должен быть комментарием вверху каждого файла, онначинается и заканчивается /*...*/.Я пытался использовать sed, но это сложно, поскольку косые черты и звездочки используются для других вещей в sed.Вот мои find и sed вместе взятые.Это заменяет все экземпляры 2017 года на 2018 и добавляет пункт, но добавляет его, даже если он уже существует.Мне нужно только добавить его, если его там нет.

find ....... -print0 | xargs -0 sed -i 's/2004 - 2017/2004 - 2018/g; 1s/^/\/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*\/\n\/*C Use, duplication, or disclosure of this software and.....etc'

Есть ли лучший способ сделать это в grep или sed?Спасибо ИЗМЕНИТЬ: Я ИСПОЛЬЗУЮ CYGWIN

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Пожалуйста, попробуйте:

find ... -print0 | while read -r -d $'\0' f; do
    if [[ $(head -1 "$f") = "/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/" ]]; then
        sed -i 's/2004 - 2017/2004 - 2018/g' "$f"
    else
        sed -i '1s#^#/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/\n/*C Use, duplication, or disclosure of this software and.....etc */\n#' "$f"
    fi
done

Он передает результат find не в xargs, а в цикл while и переключает обработку в зависимости от первой строки файла.

0 голосов
/ 30 декабря 2018

grep для g/re/p, а sed для s/old/new в отдельных строках, поэтому ни один инструмент не подходит для вашей проблемы.

Это должно делать то, что вы хотите, используя GNU awk (что у вас есть в cygwin)для редактирования на месте:

find ... -exec awk -i inplace '
FNR==1 {
    print "/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/"
    print "/*C Use, duplication, or disclosure of this software and        T*/"
    print "/*C related documentation is blah blah blah blah                T*/"
    print "/*C Copyright 2004 - 2018 COMPANY                               T*/"
    print "/*C All rights reserved.                                        T*/"
    print "/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/"

    if ( /COPYRIGHT/ ) { inCopy=1 }
    next
}
inCopy && /COPYRIGHT/ { inCopy=0 }
!inCopy
' {} +

Если старый блок авторских прав уже присутствует в начале файла, он просто заменяет весь блок новым.Вы можете изменить каждый /COPYRIGHT/ на index($0,"/*COPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHTCOPYRIGHT*/"), если хотите, чтобы более точное совпадение в этом тексте указывало на начало и конец блока комментария.

...