проблема с sed для документации шаблонов Go: попытка заменить "{{ foo.1 }}" на {{"{{"}}foo.1{{"}}"}}

#Sorry for my english
#Maybe you need execute this script with "sudo"
#Keep attention in the urls, you must set properly the last '/'. Example: /search_directory/
#In my case I am testing in the same directory where i am executing the scripts, that is the
#reason why DirectoryWhereToSearch is empty and BackupDirectory doesn't contain any '/'

FileListName="filelist.txt"     #File which contain de list of IDs
DirectoryWhereToSearch=""           #Url of directory where search for files
BackupDirectory="./FoundedFiles"    #Url of directory where to copy the matches files
FileResume="Resume.txt"         #Contain a resume of the results
FileContainAllFiles="AllInOne.txt"  #This file contain the content of all the founded files.

if [ -f $FileResume ]; then
    rm -r $FileResume
fi

if [ -f $FileContainAllFiles ]; then
    rm -r $FileContainAllFiles
fi

touch $FileResume
touch $FileContainAllFiles 

if [ -d $BackupDirectory ]; then
    rm -rf $BackupDirectory
fi
mkdir $BackupDirectory

if [ -f $FileListName ]; then   #If the file which contain all the IDs exist

    #This while search for the files and copy all the match files.
    while read ID
    do
        echo "Searching for file with ID=$ID"
        search=$(find $DirectoryWhereToSearch -type f -iname "*$ID*")
        if [ "$search" == "" ]; then
            echo "File not founded: $ID"
            echo "File not founded: $ID" >> $FileResume
        else 
            echo "File Founded: $search"
            echo "File Founded: $search" >> $FileResume
            cp -rf $search $BackupDirectory 2>/dev/null
            cat $search >> $FileContainAllFiles
        fi
        echo "--------------------------------"
    done < $FileListName

else
    echo "IDs file does not founded"
fi

Я не очень хорошо понял, какие результаты вам нужны :на всякий случай я скопирую все содержимое всех файлов в один файл, а также создам файл, в котором вы можете найти отчет обо всех основанные файлы.

Пожалуйста, проголосуйте, если было полезно ;)

0
25.01.2020, 23:02
2 ответа

Есть несколько вещей, которые неудобны с вашим sedвыражением лица.

  • [^}}]совпадает с [^}]и будет соответствовать одному символу , который не является }.
  • {и }используются в расширенных регулярных выражениях (они работают как *и +, т. е. указывают, сколько раз должно совпадать предыдущее выражение, как в a{2,4}для совпадения между 2 и 4a). Это означает, что некоторые sedреализации (GNU )будут иметь проблемы с разбором вашего выражения.

Здесь я использую базовое регулярное выражение с sed, и я разрешаю слову в {{ ... }}содержать любые буквенно-цифровые символы и точки (, которые вы могли бы изменить [[:alnum:].]на[^ ]):

$ echo '{{ foo.1 }} {{ foo.2 }}' | sed 's/{{ \([[:alnum:].]*\) }}/{{"{{"}} \1 {{"}}"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}

Это будет работать как с GNU sed, так и с BSD sed(, которые, как я полагаю, вы используете ).

Вы заметите, что выражение sedвыше почти точно такое же, как ваше, за исключением того, что я не использую расширенное регулярное выражение и переместил группу захвата в слово внутри{{ ... }}(именно так вы удаляете самые внутренние фигурные скобки, которые вы получаете в своем результате ).

2
28.01.2020, 02:21

Я получаю сообщения об ошибках типа

sed: -e expression #1, char 35: Invalid preceding regular expression

, если вы пытаетесь использовать выше sed. Попробуйте вместо этого

echo "{{ foo.1 }} {{ foo.2 }}" | sed  's/\({\|}\)\1/{{"&"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}
1
28.01.2020, 02:21

Теги

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