The texts may have spaces, symbols and points inside, but the original separators from the texts are always
///:which don't appear anywhere else inside the texts.
Não é verdade. Você deu um exemplo com Isso permite uma abordagem direta: 14:00 to 16:00 . Por um momento, vamos supor que seja verdade.
tr ':' '/' | cut -d '/' --output-delimiter=';' -f 3,5
tr unifica os delimitadores e, em seguida, cut seleciona os campos certos.
Notas:
-
--output-delimiternão é requerido pelo POSIX. Se o seucutnão suporta, esta é a alternativa:tr ':' '/' | cut -d '/' -f 3,5 | tr '/' ';'Note que não podemos usar
tr ':' ';'como o primeiro comando no pipe (o que simplificaria o resto) porque você não garante que;não apareça na entrada (cutserá confundido se faz). -
cutrecebe os campos 3 e 5 (não 2 e 4) porque tudo antes do primeiro separador já é o campo 1 (string vazia no seu caso).
No entanto, se apenas o primeiro : for um separador, o comando poderá ser:
sed 's|:|/|' | cut -d '/' --output-delimiter=';' -f 3,5
sed 's|:|/|' substituirá apenas a primeira ocorrência de : (em oposição a sed 's|:|/|g' , que é equivalente ao nosso tr ':' '/' original).
Caso você não esteja familiarizado com uma maneira padrão de usar esses filtros com arquivos, essa é a sintaxe correta (com sed e cut compatível com POSIX):
< File1.txt sed 's|:|/|' | cut -d '/' -f 3,5 | tr '/' ';' > Result.txt