Quero aplicar os comandos abaixo a todos os arquivos em um diretório, em vez de apenas um arquivo.
cat file.txt | sed -E "s/\@([0-9]+)\W+~(.*?)/\1 \2/g" | tr -d '~'
cat file.txt | sed -E "s/\@([0-9]+).*\~(.*)[~\r\n]/\1 \2/g" | sed -E "s/([0-9]+)\W+(.*)/\@\1\ = ~\2~/g"
Com
zsh
em vez debash
:Onde
ND-.
restringir a arquivos do tipo regular (determinado após a resolução do link simbólico com-
) e incluindoD
arquivos ot (arquivos ocultos).Removi algumas barras invertidas que não só não eram necessárias como também potencialmente não eram à prova do futuro, como você pode descobrir,
\@
ou\~
tinham um significado especial em versões futuras dosed
,\n
o que não faz sentido, poissed
funciona no conteúdo de linhas que não incluem delimitadores de linha.Também removi o
(.*?)
which, emsed
implementações que reconhecem esseperl
operador (que são poucas), o que seria inútil, pois corresponderia apenas à string vazia.Além disso, não posso comentar mais sobre se essas substituições fazem sentido, pois você não especificou o que elas devem fazer.
No bash, é possível, mas mais trabalhoso:
[
O-f
também verifica o tipo de arquivo após a resolução do link simbólico, altere para[ -f "$file" ] && [ ! -L "$file" ]
para excluir links simbólicos.Com a implementação GNU do
find
, você também pode fazer:Mas cuidado, a lista de arquivos não é classificada, então você os obterá em uma ordem aparentemente aleatória. Omitir arquivos ocultos (o equivalente a remover
D
oudotglob
acima) também precisaria de um! -name '.*'
, que para ser confiável teria que ser feito noC
locale, o que afetariased
a correspondência de , então você precisaria de algo como:(que assume
LC_ALL
que não foi definido inicialmente), onde definimos a localidade paraC
,find
mas a revertemos parased
.