Copiando componentes completos de uma pasta para outra, jogando uma substituição ruim

0

O final.txt se parece com:

build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping/camping.design
src/aura/camping/camping.design-meta.xml

Gostaria de substituir apenas os arquivos que contêm /aura/ em sua linha para src/aura/camping

Eu escrevi o código abaixo, mas isso gera um erro:

echo replaceText ${\$CFILE//\$CFILE/"src/aura/"($(basename -- "$(dirname -- "$CFILE")"))}

line 62: ${\$CFILE//\$CFILE/"src/aura/"($(basename -- "$(dirname -- "$CFILE")"))}: bad substitution

Este ($(basename -- "$(dirname -- "$CFILE") dá para acampar E $CFILEsrc/aura/camping/camping.design .

Mas não está substituindo src/aura/camping/camping.design por src/aura/camping

function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
        if [ "${!i}" == "${value}" ]; then
            echo "y"
            return 0
        fi
    }
    echo "n"
    return 1
}

if [ -e final.txt ]
then
        ARRAY=()
        while read CFILE
            do
                    echo Analyzing file 'basename $CFILE'
                    case "$CFILE"
                    in
                        *.app) TYPENAME="AuraDefinitionBundle";;
                        *.cmp) TYPENAME="AuraDefinitionBundle";;
                        *.css) TYPENAME="AuraDefinitionBundle";;
                        *.evt) TYPENAME="AuraDefinitionBundle";;
                        *.js) TYPENAME="AuraDefinitionBundle";;
                        *.svg) TYPENAME="AuraDefinitionBundle";;
                        *.auradoc) TYPENAME="AuraDefinitionBundle";;
                        *.design) TYPENAME="AuraDefinitionBundle";;
                        *) TYPENAME="UNKNOWN";;
                    esac

                    if [ "$TYPENAME" == "AuraDefinitionBundle" ]
                        then
                                if [ $(contains "${ARRAY[@]}" $(basename -- "$(dirname -- "$CFILE")")) != "y" ]
                                then
                                    echo baseFile from new method cFile $CFILE
                                    ARRAY+=($(basename -- "$(dirname -- "$CFILE")"))
                                    echo replaceText ${\$CFILE//\$CFILE/"src/aura/"($(basename -- "$(dirname -- "$CFILE")"))}

                                else
                                    continue
                                 fi
                        fi
            done < final.txt
else
echo Change file not found!
fi

Por fim, é executado cat final.txt | xargs -I {} cp --parents {} $1 que eu suponho que deve copiar todos os arquivos da pasta campaign para outro caminho de arquivo.

Tentei

 echo baseFile from new method cFile $CFILE
 FILENAME = "$CFILE"
 ARRAY+=($(basename -- "$(dirname -- "$CFILE")"))
 replace=$(basename -- "$(dirname -- "$CFILE")")
 echo relaceWord $replace
 echo replaceText ${FILENAME//$CFILE/$replace}
    
por Nagendra K S 19.09.2018 / 07:38

1 resposta

0

A expansão ${parameter/pattern/replacement} leva o nome de um parâmetro como o primeiro elemento. Portanto, foo=bar; echo "${foo/a/x}" produziria bxr . Em ${\$CFILE//\$CFILE/"src/aura/"($(...))} , \$CFILE não é um parâmetro válido, portanto, você recebe um erro. Se você quiser executar a substituição no conteúdo de CFILE , você usaria ${CFILE/...} .

Observe que na parte "padrão", a barra invertida escapa do cifrão, portanto \$CFILE procuraria a string literal $CFILE . Então, novamente, usar ${CFILE/$CFILE/...} usaria o conteúdo de CFILE como o texto para a substituição e como o texto a ser usado como padrão. Substituiria todo o conteúdo da variável (*) . Isso seria o mesmo que apenas escrever a parte de substituição sem o parâmetro, então eu não sei exatamente o que você está fazendo aqui.

(* A menos que seja um glob que não corresponda a si mesmo, é claro.)

    
por 19.09.2018 / 09:10