Script Bash para editar arquivos .ics

1

Eu gostaria de criar um script bash para escolher arquivos .ics em uma pasta, em seguida, fazer um 'localizar e substituir' dentro desse arquivo selecionado, depois salve e renomeie esse arquivo. Reuni algumas coisas de pesquisas, mas não sei o suficiente sobre o que estou fazendo para que tudo funcione ...

Aqui está o que eu tenho para um menu:

    #!/bin/bash

echo "The following '*.ics' files were found; select one:"

# set the prompt used by select, replacing "#?"
PS3="Use number to select a file or 'stop' to cancel: "

# allow the user to choose a file
select filename in *.ics
do
# leave the loop if the user says 'stop'
if [[ "$REPLY" == stop ]]; then break; fi

# complain if no file was selected, and loop to ask again
if [[ "$filename" == "" ]]
then
    echo "'$REPLY' is not a valid number"
    continue
fi

# now we can use the selected file
echo "$filename installed"

# it'll ask for another unless we leave the loop
break
done

Este é o código que eu uso atualmente para editar os arquivos .ics, mas ele altera TODOS os arquivos .ics no diretório atual:

#!/bin/bash

###Fixes all .ics files to give ALL DAY events rather than 0000-2359  
####All .ics files
FILES="*.ics"


# for loop read each file
for f in $FILES
do
INF="$f"

##Change DTSTART:[yyyymmddThhmmss] to DTSTART;VALUE=DATE...##

sed -i[org] 's/DTSTART:2016/DTSTART;VALUE=DATE:2016/g' $INF

sed -i[org] 's/T[0-9][0-9][0-9][0-9][0-9][0-9]/ /g' $INF

###Remove DTEND:###
sed -i[org] 's/DTEND:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ /g'$INF

done

Como posso colocar isso tudo junto para alcançar meu objetivo?

    
por Chad Wright 21.09.2016 / 19:56

2 respostas

1

Você poderia estruturá-lo usando uma construção case , como esta:

#!/bin/bash

shopt -s nullglob

echo 'The following '*.ics' files were found; select one:'

select f in *.ics "Quit"; do
  case $f in
    "Quit")
      echo "Quitting"
      break
      ;;
    *)
      if [ -z "$f" ]; then
        echo "Invalid menu selection"
      else
        echo "Doing something with $f"
      fi
      ;;
    esac
done

Altere o echo "Doing something with $f" para fazer o que quiser com o arquivo selecionado - se for relativamente complexo, sugiro movê-lo para uma função do shell. Lembre-se de citar, por exemplo, "$f" para evitar a divisão de palavras.

    
por steeldriver 21.09.2016 / 21:08
0

Ok, eu percebi. Aqui está o meu código:

#!/bin/bash


shopt -s nullglob

echo 'The following '*.ics' files were found; select one:'

select f in *.ics "Quit"; do
  case $f in
    "Quit")
      echo "Quitting"
      break
      ;;
    *)
      if [ -z "$f" ]; then
        echo "Invalid menu selection"
      else
        echo "Creating all-day events in $f"
          ##Change DTSTART:[yyyymmddThhmmss] to DTSTART;VALUE=DATE...##
          sed -i.orig 's/DTSTART:2016/DTSTART;VALUE=DATE:2016/g' "$f"
          sed -i.orig 's/T[0-9][0-9][0-9][0-9][0-9][0-9]/ /g' "$f"
          ###Remove DTEND:###
          sed -i.orig  's/DTEND:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ /g' "$f"
      fi
      ;;
    esac
done

Existe uma maneira de repetir o menu após uma resposta válida ou inválida? (Desculpe, eu sou um pouco novato nessas coisas, tentando aprender como eu vou.)

    
por Chad Wright 23.09.2016 / 17:13