Remover linha com exatamente n caracteres

0

Eu tenho vários arquivos .txt enormes e preciso remover uma linha se ela tiver exatamente 9 caracteres. Nem mais nem menos.

Existe uma maneira de fazer isso usando o awk / sed?

    
por Ehatre 27.11.2016 / 20:40

5 respostas

3

Com regexes estendidos do GNU sed :

for file in ./*.txt; do
    sed -i -r '/^.{9}$/d' "${file}"
done

(Use -E em vez de -r no FreeBSD / macOS ( -E também funcionará nas versões recentes do GNU sed ) e -i '' em vez de -i )

Como apontado por don_crissti , com GNU sed você não precisa do loop:

sed -s -i -r '/^.{9}$/d' ./*.txt
    
por 27.11.2016 / 21:01
4

com awk :

for f in ./*.txt; do
    awk 'length($0) != 9' "$f" >"destdir/$f"
done

com sed :

for f in ./*.txt; do
    sed '/^.\{9\}$/d' "$f" >"destdir/$f"
done

com grep :

for f in ./*.txt; do
    egrep -vx '.{9}' "$f" >"destdir/$f"
done
    
por 27.11.2016 / 21:03
1

Isso pode funcionar:

grep -vE '^.{9}$' filename > new_filename

Mude o 9 para qualquer caractere necessário.

       -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
       -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).

. significa qualquer caractere, {9} significa corresponder a esse padrão 9 vezes. ^ significa início de linha e $ significa fim de linha.

    
por 27.11.2016 / 21:05
1
awk length!=9 < in > out
    
por 30.11.2016 / 00:57
0
for i in *.txt
do
  egrep -v '^.........$' <"$i" >destdir/"$i"
done

Ou, se você insistir em usar sed em vez de egrep :

for i in *.txt
do
  sed '^.........$/d' <"$i" >destdir/"$i"
done

Para remover linhas com 235 caracteres:

X=""
for i in 'seq 1 235'
do
  X="$X."
done

for i in *.txt
do
  egrep -v '^'"$X"'$' <"$i" >destdir/"$i"
done

Simplicidade em si!

    
por 27.11.2016 / 20:53