Quero exclude MSG
e do meu caminho com despesa de parâmetro de shell usando colchetes PDF
.DOC
Quando coloco MSG
entre colchetes só apaga o M
em vez de MSG
. Procurei na internet e li a documentação, mas ainda não consegui entender como fazer isso corretamente. Talvez eu não saiba as palavras-chave certas para pesquisar.
Meu código para excluir apenas MSG
find "${INPUTPATH}" -mindepth 2 -maxdepth 2 -type d -print0 | while IFS= read -r -d '' file; do
echo "${file}"
casenumber="${file#${INPUTPATH}/[MSG]}"
echo "${casenumber}"
done
entrada:
/home/user/output/test/PDF/2218-0
/home/user/output/test/PDF/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/MSG/2226-4
/home/user/output/test/MSG/2226-4
/home/user/output/test/MSG/2222 -2
/home/user/output/test/MSG/2222 -2
/home/user/output/test/MSG/2218-0
/home/user/output/test/MSG/2218-0
Saída atual para excluir MSG:
/home/user/output/test/PDF/2218-0
/home/user/output/test/PDF/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/MSG/2226-4
SG/2226-4
/home/user/output/test/MSG/2222 -2
SG/2222 -2
/home/user/output/test/MSG/2218-0
SG/2218-0
Resultado esperado:
/home/user/output/test/PDF/2218-0
/home/user/output/test/PDF/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/MSG/2226-4
/2226-4
/home/user/output/test/MSG/2222 -2
/2222 -2
/home/user/output/test/MSG/2218-0
/2218-0
Na verdade, quero excluir MSG, PDF e DOC desta forma
find "${INPUTPATH}" -mindepth 2 -maxdepth 2 -type d -print0 | while IFS= read -r -d '' file; do
echo "${file}"
casenumber="${file#${INPUTPATH}/[MSG][PDF][DOC]/}"
echo "${casenumber}"
done
Entendo por que o código acima não funciona. Mas primeiro preciso resolver o MSG, só fazer isso funcionar
Resultado final esperado:
/home/user/output/test/PDF/2218-0
2218-0
/home/user/output/test/DOC/2218-0
2218-0
/home/user/output/test/MSG/2226-4
2226-4
/home/user/output/test/MSG/2222 -2
2222 -2
/home/user/output/test/MSG/2218-0
2218-0
Na verdade não é global, mas ...
Versões recentes do Bash podem fazer correspondência baseada em expressões regulares com seu operador RegEx
=~
quando usado em colchetes de teste estendidos[[ ... ]]
... Ele pode capturar grupos(...)
e possui umaBASH_REMATCH
matriz integrada onde o índice zero${BASH_REMATCH[0]}
se refere a toda a correspondência e o próximo índice${BASH_REMATCH[1]}
se refere ao primeiro captura de correspondência de grupo e a próxima${BASH_REMATCH[2]}
refere-se à segunda captura de correspondência de grupo e assim por diante.Então, você poderia fazer algo assim:
[MSG]
como um padrão glob corresponde a qualquer um dos caracteresM
ou . Para corresponder a , ou , você usa in ou em ksh. bash não oferece suporte a operadores zsh glob, mas oferece suporte a um subconjunto de operadores ksh, incluindo aquele after , portanto, no bash:S
G
MSG
DOC
PDF
(MSG|DOC|PDF)
zsh
@(MSG|DOC|PDF)
shopt -s extglob
Atribuiria a
casenumber
, o conteúdo$file
despojado da parte inicial mais curta que corresponde ao conteúdo de$INPUTPATH
(literalmente graças às aspas em torno dele que são necessárias em ksh/bash ao contrário de zsh), seguido por/
seguido porMSG
,DOC
ouPDF
.No ksh, apenas omita o
shopt -s extglob
que é específico do bash e não é necessário no ksh. Em zsh:Não para responder exatamente à sua pergunta, mas algumas notas sobre este caso específico.
Dado que você tem
find "${INPUTPATH}" -mindepth 2 -maxdepth 2
isso, todos os caminhos resultantes devem ter apenas uma barra após o inicial$INPUTPATH
, então você pode desconsiderar qual sequência específica de três letras você tem e apenas remover qualquer coisa até o próximo/
:ou, como é a última barra, basta remover tudo até a última
/
:Aqui, o dobro
#
significa levar a partida mais longa.Além disso, você pode eliminar a
$INPUTPATH
parte da saída (substituindo-a por apenas.
) se estivercd
lá primeiro, antes de executarfind
: