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-delimiter
não é requerido pelo POSIX. Se o seucut
nã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 (cut
será confundido se faz). -
cut
recebe 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