Como eu usaria o sed para excluir todas as linhas em um arquivo de texto que contenham uma sequência específica?
shell
sed
text-parsing
in-place
Laranja mecânica
fonte
fonte
sed '/pattern to match/d' ./infile > ./newfile
ou se você quiser fazer uma edição no local, pode adicionar a-i
bandeira ao sed como emsed -i '/pattern to match/d' ./infile
. Note que o-i
sinalizador requer GNU sed e não é portátilsed -i.backup '/pattern to match/d' ./infile
) Isso me levou a fazer edições no local.sed
os arquivos que não são controlados por versão.sed -i '' '/pattern/d' ./infile
.Existem muitas outras maneiras de excluir linhas com sequência específica, além de
sed
:AWK
Ruby (1.9+)
Perl
Shell (bash 3.2 e posterior)
GNU grep
E, é claro
sed
(imprimir o inverso é mais rápido que a exclusão real):fonte
sed
exemplo tem um comportamento diferente, apenas greps! deveria ser algo parecidosed -n -i '/pattern/!p' file
.grep -v "pattern" file > temp; mv temp file
isso pode se aplicar a alguns dos outros exemplos, dependendo do valor de retorno.seq -f %f 10000000 >foo.txt
. sed d:time sed -i '' '/6543210/d' foo.txt
0m9.294s reais. sed! p:time sed -i '' -n '/6543210/!p' foo.txt
0m13.671s reais. (Para arquivos menores, a diferença é maior.)Você pode usar o sed para substituir as linhas no lugar de um arquivo. No entanto, parece ser muito mais lento do que usar grep para o inverso em um segundo arquivo e depois mover o segundo arquivo sobre o original.
por exemplo
ou
O primeiro comando demora três vezes mais na minha máquina.
fonte
sed '/pattern/d' filename > filename2; mv filename2 filename
A maneira mais fácil de fazer isso, com o GNU
sed
:fonte
-r
opção (ou-E
, dependendo da sua versão). Isso permite o uso de metacaracteres regex+
,?
,{...}
e(...)
.Você pode considerar o uso
ex
(que é um editor padrão baseado em comandos do Unix):Onde:
+
executa o comando Ex (man ex
), o mesmo-c
que o executawq
(gravar e sair)g/match/d
- Comando Ex para excluir linhas com dadosmatch
, consulte: Potência de gO exemplo acima é um método compatível com POSIX para edição in-loco de um arquivo, de acordo com esta publicação, nas especificações
ex
Unix.SE e POSIX .A diferença
sed
é que:A menos que você goste de código não transportável, sobrecarga de E / S e outros efeitos colaterais ruins. Então, basicamente, alguns parâmetros (como no local /
-i
) são extensões não padrão do FreeBSD e podem não estar disponíveis em outros sistemas operacionais.fonte
man ex
isso me dá o homem paravim
, ao que pareceex
faz parte do vim ... se eu entendi direito que meios a sintaxe padrão paramatch
é vimregex.com que é semelhante, mas diferente para POSIX e PCRE sabores?:g
é um comando compatível com POSIX com algumas pequenas diferenças . Presumo que o PCRE tenha sido baseado nisso.Eu estava lutando com isso no Mac. Além disso, eu precisava fazer isso usando substituição de variável.
Então eu usei:
sed -i '' "/$pattern/d" $file
onde
$file
é o arquivo onde a exclusão é necessária e$pattern
é o padrão a ser correspondido para exclusão.Eu escolhi o
''
deste comentário .O que deve ser observado aqui é o uso de aspas duplas em
"/$pattern/d"
. A variável não funciona quando usamos aspas simples.fonte
sed
requer um parâmetro depois-i
, então se você não quer um backup, você ainda tem que adicionar uma string vazia:-i ''
sed -i "/$pattern/d" $file
. Obrigado pela sua resposta.Fiz uma pequena referência com um arquivo que contém aproximadamente 345.000 linhas. O caminho com
grep
parece ser cerca de 15 vezes mais rápido que osed
método neste caso.Eu tentei com e sem a configuração LC_ALL = C, não parece alterar significativamente os tempos. A cadeia de pesquisa (CDGA_00004.pdbqt.gz.tar) está em algum lugar no meio do arquivo.
Aqui estão os comandos e os horários:
fonte
Você também pode usar isso:
Aqui
-v
será impresso apenas outro que não o seu padrão (isso significa correspondência invertida).fonte
Para obter um resultado semelhante no local,
grep
você pode fazer o seguinte:fonte
bash
shell ou similar (nãotcsh
).SED:
'/James\|John/d'
-n '/James\|John/!p'
AWK:
'!/James|John/'
/James|John/ {next;} {print}
GREP:
-v 'James\|John'
fonte
O primeiro comando edita o (s) arquivo (s) no local (-i).
O segundo comando faz a mesma coisa, mas mantém uma cópia ou backup dos arquivos originais, adicionando .bk aos nomes dos arquivos (.bk pode ser alterado para qualquer coisa).
fonte
echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt
fonte
Caso alguém queira fazer isso para correspondências exatas de strings, você pode usar a
-w
flag em grep - w para todo. Ou seja, por exemplo, se você deseja excluir as linhas que têm o número 11, mas mantenha as linhas com o número 111:Também funciona com o
-f
sinalizador se você deseja excluir vários padrões exatos ao mesmo tempo. Se "lista negra" for um arquivo com vários padrões em cada linha que você deseja excluir de "arquivo":fonte
-w, --word-regexp Select only those lines containing matches that form whole words.
vs-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
fonte
para mostrar o texto tratado no console
salvar texto tratado em um arquivo
anexar informações de texto tratadas a um arquivo existente
para tratar o texto já tratado, neste caso, remova mais linhas do que foi removido
o
| more
texto será exibido em pedaços de uma página por vez.fonte
Você pode usar o bom e velho
ed
para editar um arquivo de maneira semelhante à resposta usadaex
. A grande diferença nesse caso é queed
recebe seus comandos por meio da entrada padrão, não como argumentos de linha de comando comoex
pode. Ao usá-lo em um script, a maneira usual de acomodar isso é usarprintf
para canalizar comandos para ele:ou com um heredoc:
fonte