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 -iopção de sed:
sed -i.bak '/^HERE IT IS/d' <file>
O arquivo original permanecerá como <file>.bake 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 grepe sedrespostas 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 -iopçã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 awkno 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
bashum 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.pye 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
vimassim:vim '+g/^HERE IT IS/d' +wq test.txt;)