Script Bash para extrair palavras-chave do diretório atual

2

Eu tenho um diretório no seguinte formato:

/folder1/folder2/name_X_Y_Z_A

em que X é um número, Y , Z e A são cadeias com 3 ou 4 caracteres.

Eu quero escrever um arquivo de script de shell que faça o seguinte:

  • extraia X e Z do nome da pasta
  • crie a string /folder1/folder2/name_(X-1)_Y_Z_A
  • copie o arquivo string_Z.dat desse diretório

Estou perdido em como extrair padrões específicos de $PWD . As posições dos caracteres de X e Z não precisam ser as mesmas, pois o comprimento do número e o comprimento de name podem variar.

    
por sodiumnitrate 05.08.2016 / 21:03

3 respostas

3

Você pode primeiro aparar os componentes do caminho principal usando a sintaxe de substituição do parâmetro ${PWD##*/} do shell e ler o nome da base em uma matriz usando sublinhados como um separador de campo:

IFS=_ read -a arr <<< "${PWD##*/}"

Como as matrizes bash são indexadas com zero, as partes que você deseja devem estar em ${arr[1]} e ${arr[3]} , por exemplo,

newdir="/folder1/folder2/name_$((${arr[1]}-1))_${arr[3]}_Z_A"

[Nota: Eu assumi que você quer dizer o resultado aritmético de (X-1) ao invés da string literal.]

    
por 05.08.2016 / 21:35
3

Assumindo que X, Y, Z, A não possuem sublinhados, então podemos "cortar" a cauda toda vez

por exemplo

# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA

A=${DIR##*_} ; DIR=${DIR%_*}
Z=${DIR##*_} ; DIR=${DIR%_*}
Y=${DIR##*_} ; DIR=${DIR%_*}
X=${DIR##*_} ; DIR=${DIR%_*}

let X=X-1
DIR="${DIR}_${X}_${Y}_${Z}_${A}"

echo $DIR

A outra maneira de fazer isso é descobrir onde X termina e retirar o resto de uma só vez:

# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA

DIRX=${DIR%_*_*_*}

YZA=${DIR#$DIRX}
X=${DIRX##*_} ; DIRX=${DIRX%_*}

let X=X-1
DIR="${DIRX}_${X}${YZA}"

echo $DIR

Em ambos os casos, obtemos /folder1/folder2/name_99_YYYY_ZZZZ_AAAA como resultado. Você pode facilmente cp seu arquivo para lá.

    
por 05.08.2016 / 21:45
2

Se você pode usar python:

$ pwd=/folder1/folder1/name_10_ABCD_ABC_ABCD # or use $PWD
$ new=$(python -c "import os; x='"$pwd"'.rsplit('/', 1)[1].split('_'); x[1]=str(int(x[1])+1); print('_'.join(x))")
$ echo $new
name_11_ABCD_ABC_ABCD
    
por 05.08.2016 / 21:25