awk para remover string de uma variável

0

HP-UX *** B.11.31 U ia64 *** licença de usuário ilimitado

Eu quero mover um arquivo no diretório atual chamado abc.txt para um diretório chamado ./begperl. Enquanto faço isso, quero que a versão movida do arquivo seja nomeada como ab.txt. O que eu quero é remover uma string predefinida do nome do arquivo e movê-la, e excluir o arquivo original com base em mais uma terceira variável = Y / N. Eu tentei os oneliners abaixo em vão.

awk -v name=abc.txt -v dir=begperl 'BEGIN{ renamed_var=substr("c", "", name);system("mv " name  "./"dir/renamed_var)}' 

awk -v name=abc.txt -v dir=begperl 'BEGIN{ renamed_var=substr("c", "", name); print renamed_var}'

awk -v name=abc.txt -v dir=begperl 'BEGIN{ print substr("c", "", name) }'


awk -v name=abc.txt -v dir=begperl -v variable_two=substr("c", "", name){print variable_two}' 


awk -v name=abc.txt -v dir=begperl -v variable_two=substr("c", "", name){print variable_two}'

O único forro que eu consegui trabalhar é

awk -v name=abc.txt -v dir=begperl 'BEGIN{ system("mv " name " ./"dir)}' 

Imensos agradecimentos

    
por user3146086 01.04.2015 / 13:13

3 respostas

3

Por que você está usando awk para isso? Se você tem tanto o original quanto o nome do alvo, por que não apenas mv abc.txt begperl/ab.txt ?

Se você não tem o nome do alvo e quer apenas remover um caractere do original, você pode fazê-lo no shell. Novamente, não há necessidade de awk :

file="abc.txt"; mv "$file" begperl/"${file//c}"

Isso removerá todas as ocorrências de c de $file . Para remover apenas o primeiro, use

file="abc.txt"; mv "$file" begperl/"${file/c}"

Alternativamente, você poderia fazer

mv abc.txt begperl/"$(echo "abc.txt" | sed 's/c//')"
    
por 01.04.2015 / 13:50
3

Você precisa do comando sub (sub stitute ) em vez do comando substr (sub string ): compare

$ awk -v name="abc.txt" 'BEGIN {substr("c","",name) ; print name}'
abc.txt

com

$ awk -v name="abc.txt" 'BEGIN {sub("c","",name) ; print name}'
ab.txt

No entanto, a menos que você esteja fazendo isso como um exercício de programação para aprender awk , realmente não há motivo para não usar o seu shell para coisas como essa, por ex. em bash :

newname="${name%c.*}.${name##*.}"

forma uma string de name com a correspondência final mais curta começando com c. removed, concatenada com a extensão de ponto formada pela remoção da parte mais longa correspondente até .

    
por 01.04.2015 / 13:36
0

Eu sou o OP. Eu não acho que isso é tão fácil como eu pensei que seria para ser implementado em um forro único. Acho que vou trabalhar neste forro mais tarde (ou nunca; -))

#!/usr/bin/ksh
ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE=$1
REMOVE_STRING_VARIABLE=$2
DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE=$3
if [[ $# -ne 3 ]]
then
echo "Script requires three parameters. First:Filename with path. Second:String to remove from filename. Third:Y or N to delete file"
exit 1
fi
ORIGINAL_FILE_NAME_VARIABLE='echo  ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} | awk -F '/' '{print $NF}''
#echo ${ORIGINAL_FILE_NAME_VARIABLE}
AMENDED_FILE_NAME_VARIABLE='echo ${ORIGINAL_FILE_NAME_VARIABLE} | sed "s/${REMOVE_STRING_VARIABLE}//g"'
#echo ${AMENDED_FILE_NAME_VARIABLE}
ORIGINAL_FILE_LOCATION_DIR='echo ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} | awk 'BEGIN{FS=OFS="/"}{$NF=""; NF--; print}''
if [[ -f ${ORIGINAL_FILE_LOCATION_DIR}/${AMENDED_FILE_NAME_VARIABLE} ]]
then
AMENDED_FILE_NAME_VARIABLE=${AMENDED_FILE_NAME_VARIABLE}_$$_$$
fi
echo ${ORIGINAL_FILE_NAME_VARIABLE}|grep -q ${REMOVE_STRING_VARIABLE}
if [[ $? -ne 1 ]] 
then
cp ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} ${ORIGINAL_FILE_LOCATION_DIR}/${AMENDED_FILE_NAME_VARIABLE}
if [[ ${DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} = 'y' || ${DELETE_ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE} = 'Y' ]]
then
rm ${ORIGINAL_FILE_NAME_WITH_PATH_VARIABLE}
fi
fi

Mas eu realmente achei que isso fosse possível em um único forro. Eu sou o OP.Comentários?

    
por 02.04.2015 / 12:56

Tags