Em um arquivo com muitas linhas, quero excluir as linhas que começam com HERE IT IS
.
Como posso fazer isso usando apenas ferramentas de linha de comando?
Em um arquivo com muitas linhas, quero excluir as linhas que começam com HERE IT IS
.
Como posso fazer isso usando apenas ferramentas de linha de comando?
Respostas:
Tente sed
:
sed -i '/^HERE IT IS/d' <file>
AVISO: É melhor fazer um backup ao usar a -i
opção de sed
:
sed -i.bak '/^HERE IT IS/d' <file>
O arquivo original permanecerá como <file>.bak
e o arquivo modificado permanecerá <file>
.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.
Além das respostas grep
e sed
respostas muito boas que você recebeu, aqui estão outras ferramentas que podem fazer a mesma coisa:
Algumas maneiras de Perl:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
Você pode adicionar a -i
opção a qualquer um dos exemplos para editar o arquivo no local:
perl -i.bak -ne '/^HERE IT IS/ || print' file
g) awk
awk '!/^HERE IT IS/' file > newfile
As versões mais recentes (4.1.1 e posterior) do GNU awk
(o padrão awk
no Linux) também podem editar o arquivo no local:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash
, zsh
, ksh
, provavelmente outros). Isso é meio bobo, porém, pode ser feito, mas outras ferramentas são melhores.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
um me fez LOL)
printf "%s\n" "$line"
: citando $ line para preservar espaços em branco e evitando alguns problemas de eco (interpretação de caracteres especiais, etc.). e evita a necessidade de adicionar --
também.
IFS=
e -r
, posso muito bem percorrer todo o caminho e torná-la robusta.
sed
é definitivamente o caminho a percorrer.
Essa ligeira modificação do comando @heemayl forneceu que você exclua a linha, independentemente de o mesmo caso ser usado no padrão ou não, devido ao I na referência do padrão.
sed -i '/HERE IT IS/Id' <file>
Se você tiver vários arquivos em um diretório em que deseja fazer isso, poderá combiná-lo com o achado.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
A opção maxdepth significa que isso não ocorrerá novamente nos diretórios.
Outra opção python:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Onde f é o caminho para o arquivo, entre aspas.
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
asserção lookahead negativa que faz com que o mecanismo regex corresponda a todo o limite inicial de linha ( que geralmente é correspondido por^
) apenas se não for seguido pela stringHERE IT IS
Pitão
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
Salve o script em um arquivo, diga script.py
e execute-o através do comando abaixo no terminal.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, mas não é muito mais eficiente que startswith
. Eu me perguntava como [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
não produziria a saída em uma lista.
Você pode usar o Vim no modo Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g
pesquisa global
d
excluir
x
salvar e fechar
vim
assim:vim '+g/^HERE IT IS/d' +wq test.txt
;)