
Quero usar tac
para reverter um arquivo de texto caractere por caractere. Na página de informações do coreutils encontrei um exemplo dizendo: #Reverse um arquivo caractere por caracteretac -r -s 'x\|[^x]'
No entanto, a execução tac -r -s
parece abrir a entrada padrão em vez de imprimir o arquivo. O que 'x\|[^x]'
significa e o que devo fazer?
Também observei que a saída para tac [file]
e tac -r [file]
é a mesma e é igual a cat [file]
. Ainda não consigo descobrir char por char reverso.
Responder1
Para reverter um arquivo caractere por caractere usando tac
, use:
tac -r -s 'x\|[^x]'
Isto está documentado eminfo tac
:
# Reverse a file character by character. tac -r -s 'x\|[^x]'
-r
faz com que o separador seja tratado como uma expressão regular.-s SEP
usa SEP
como separador. x\|[^x]
é uma expressão regular que corresponde a todos os caracteres (aqueles que são x
e aqueles que não são x
).
$ cat testfile
abc
def
ghi
$ tac -r -s 'x\|[^x]' testfile
ihg
fed
cba%
$
tac file
não é o mesmo que cat file
a menos que file
tenha apenas uma linha. tac -r file
é o mesmo tac file
porque o separador padrão é \n
, que é o mesmo quando tratado como uma expressão regular e não.
Responder2
Se você não está preocupado com oPersonagem de baixa frequência(veja os comentários de mosvy), então é muito mais eficiente usar rev
do que tac -r -s 'x\|[^x]'
canalizá-lo, tac
se necessário.
$ cat testfile
abc
def
ghi
$ rev testfile
cba
fed
ihg
$ rev testfile|tac
ihg
fed
cba
Esta solução é muito mais barata tac -r -s 'x\|[^x]'
porque as expressões regulares tendem a desacelerar drasticamente as coisas.