Remove o caractere ^ L (também conhecido como \ f / FF / alimentação de formulário / quebra de página)

3

Como faço para remover o caractere ^L e as linhas em branco que vêm depois dele em um arquivo unix? Eu tentei o abaixo e fui capaz de remover o VT e os espaços, mas não estou conseguindo remover o caractere ^ L e as linhas em branco depois dele

tr -s '01\' '|' <$x>> modified.txt

e:

tr -d '3'  <modified1.txt>> $FILENAME
    
por Nicholas Namacha 31.07.2015 / 10:57

3 respostas

7

Essa é a notação de cursor para o caractere de feed de formulário . Com a implementação GNU de sed , você pode removê-lo usando seu valor octal, \o14 :

sed 's/\o14//g' file 

Você também pode usar o código de escape:

sed 's/\f//' file

Esses caracteres podem ser digitados no terminal pressionando Ctrl V e, em seguida, o código do caractere. Neste caso, Ctrl L . Então, digite isso:

sed 's/

Em seguida, tecle Ctrl V e depois Ctrl L :

sed 's/^L

Agora, complete o comando:

sed 's/^L//g' file

Não escreva ^L e não o cole acima, use o atalho de teclado que eu dei.

Você também pode removê-lo com tr :

tr -d '\f' < file

Ou perl :

perl -pe 's/\f//g' file

Para excluir o \f e todas as linhas em branco que o seguem, você pode fazer algo como:

perl -0pe 's/\f\s*/\n/s' file
    
por 31.07.2015 / 11:10
4

Com o ksh93, bash, zsh, mksh, o recente FreeBSD sh:

sed $'/\f/,/./{/\f/d;/./!d;}'

Isso falhará se houver sequências consecutivas de \f\n\n... s.

Com o GNU sed , você pode omitir o $ .

POSIXly ( $'...' ainda não é POSIX, embora provavelmente esteja em SUSv5):

FF=$(printf '\f')
sed "/$FF/,/./{/$FF/d;/./!d;}"

Observe que a especificação POSIX atual requer uma nova linha em vez de ; antes de } , mas na verdade é uma bug na especificação POSIX , pois nem mesmo a implementação inicial de sed exigia isso.

    
por 31.07.2015 / 11:13
1
sed "$(printf '$!N;/\f')"'\n/,/\n./!P;D' <in >out

... deve funcionar desde um shell compatível com POSIX, printf e sed .

Você realmente não precisa de printf se você simplesmente inserir o caractere literalmente. Normalmente, você pode fazer isso com CTRL+V e em CTRL+L .

Então ...

sed '$!N;/^L\n/,/\n./!P;D' <in >out

... onde a sequência ^L acima é obtida ao fazer CTRL+V , então CTRL+L e representa a forma literal personagem de feed.

    
por 31.07.2015 / 11:24