Você insiste em usar o sed? Isso é fácil, por exemplo, em python. E sem dúvida ainda mais fácil em perl. Embora a questão não esteja muito bem definida. Copiar um arquivo, removendo todas as linhas com mais de 2048 ou outra coisa?
Recebo a mensagem de erro sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi 13/10
1
@ wedi você provavelmente deseja instalar a versão GNU em vez da versão BSD que acompanha o Mac. Isso é fácil com o brew
Freedom_Ben
A pergunta diz "se for maior que XY (por exemplo, 2048 caracteres)". Então deve ser> 2048 e não => 2048
ajcg 28/08
1
@ajcg, é> 2048. Observe que há um período extra no final da regex para corresponder ao 2049 ° caractere.
forcefsck
@forcefsck e não seria melhor se você tirar "^"? (com o seu comando, você está apenas removendo as linhas que "começam com XYZ", mas se o XYZ estiver em outra parte da linha, ele não será excluído)
ajcg
7
Aqui está uma solução que exclui linhas com 2049 ou mais caracteres:
sed -E '/.{2049}/d' <file.in >file.out
A expressão /.{2049}/dcorresponderá a qualquer linha que contenha pelo menos 2049 caracteres e os excluirá da entrada, produzindo apenas uma linha mais curta na saída.
Com awklinhas de impressão de comprimento 2048 ou menor:
Pessoalmente, @Faheem, prefiro sua resposta. O motivo é que foi muito fácil transformá-lo em 'excluir todas as linhas menores que x'. Eu não uso Python o tempo todo, mas quando eu sempre sinto que devo aprender bem.
Ixtmixilix
@ixtmixilix: Sim, o uso de uma linguagem completa como o Python é bastante flexível. Obrigado pelo comentário.
lol, mas sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
Alex Gray
Ah Eu instalei a versão GNU em vez da versão BSD que acompanha o Mac, como @Freedom_Ben sugerido acima. Mas Kusalananda encontrou a opção para ativar o regex estendido. Então você deve ir com a solução dele se ainda tiver esse problema. ;)
quarta
0
Com o gnu-sed, você pode usar o sinalizador -r, para evitar digitar as barras invertidas e uma vírgula, para definir um intervalo aberto:
sed -r "/.{2049,}/d" input.txt > output.txt
com:
x {2049}, significando exatamente 2049 xs
x {2049,3072}, que significa de 2049 a 3072 xs
x {2049,} significando pelo menos 2049 xs
x {, 2049}, significando no máximo 2049 xs
Para os intervalos, para não corresponder a padrões maiores, você precisaria de âncoras de linha como
Respostas:
fonte
sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)
(Mac OS X)Aqui está uma solução que exclui linhas com 2049 ou mais caracteres:
A expressão
/.{2049}/d
corresponderá a qualquer linha que contenha pelo menos 2049 caracteres e os excluirá da entrada, produzindo apenas uma linha mais curta na saída.Com
awk
linhas de impressão de comprimento 2048 ou menor:Imitando a
sed
solução literalmente comawk
:fonte
sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)
(Mac OS X)Algo assim deve funcionar em Python.
fonte
fonte
-l
não é necessário, no entanto.Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
length($_) > 2048 && print
.length
é um atalho paralength($_)
qualquer maneira.As respostas acima não funcionam para mim no Mac OS X 10.9.5.
O código a seguir funciona:
sed '/.\{2048\}/d'
.Embora não seja solicitado, mas fornecido como referência, o inverso pode ser alcançado com o seguinte código:
sed '/.\{2048\}/!d'
.fonte
sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)
(Mac OS X, 10.10.4
)Com o gnu-sed, você pode usar o sinalizador -r, para evitar digitar as barras invertidas e uma vírgula, para definir um intervalo aberto:
com:
Para os intervalos, para não corresponder a padrões maiores, você precisaria de âncoras de linha como
fonte