Como deletar uma linha com uma dada palavra usando a função SED

0

Eu tenho um arquivo .txt com dentro

ID       VALUE
test     value_1
testing  value_2
first    value_3
second   value_4

Estou tentando escrever um script de shell que excluirá uma linha correspondente a um determinado ID. Por exemplo, eu gostaria de excluir a linha com o ID "test", então eu encontrei no fórum que poderia usar a função "sed" da seguinte maneira:

sed -i '/test/d' file.txt

No entanto, essa função também excluirá a linha com o ID "testing" porque essa palavra é composta pela palavra "test". Além disso, a função irá verificar em todas as linhas, por isso, se houver um valor com a palavra "teste", também será excluída.

Então,

  • Como posso verificar e excluir todas as linhas com a palavra "teste" SOMENTE na coluna ID, dado que o ID está no início de cada linha, também posso perguntar como posso verificar e excluir cada linha START com a palavra " teste "?
  • Como posso excluir apenas quando o ID é "teste" e não composto com a palavra "teste" (neste caso, "teste" é excluir)
  • A função "sed" é realmente adequada?

Obrigado

    
por S7_0 03.01.2016 / 22:17

2 respostas

7

Use \b ou \s e ^

\b para corresponder aos limites das palavras e ^ para corresponder ao início de uma linha:

sed -i '/^test\b/d' file.txt

Em vez de \b , considere \s para corresponder a um caractere de espaço se suas colunas forem delimitadas por espaço em branco.

É sed adequado?

Sim.

O que se segue é uma breve menção de (a maioria dos) "outros suspeitos usuais" no processamento de texto em linha de comando:

Alternativamente, às vezes eu uso grep para propósitos similares, especialmente se eu simplesmente quiser trabalhar em uma cópia do arquivo, redirecionar a saída ou transmitir a saída para outro utilitário:

grep -v '^test\b' file.txt 

ou usando a correspondência de palavras -w :

grep -vw '^test' file.txt

Ambas as saídas:

ID       VALUE
testing  value_2
first    value_3
second   value_4

Existem muitas outras opções mais poderosas disponíveis quando você entra nas linguagens de script de nível superior. awk é uma boa escolha intermediária e é bom para lidar com entradas tabulares como esta:

awk 'NR > 1 && $1 != "test" { print $1,":",$2 }' test.txt

NR > 1 ignora a primeira linha (cabeçalho) e $1 != "test" usa uma comparação de cadeia simples em vez de uma expressão regular (embora você possa usar equivalentemente !/^test / ). O bloco { print ... } imprime as primeiras e segundas colunas separadas por dois pontos (arbitrário, apenas para mostrar um pouco do que é possível):

testing : value_2
first : value_3
second : value_4

então awk é uma boa ferramenta para aprender. Depois disso, você está no reino das linguagens de programação completas, como Perl, Python, etc. Elas podem ser usadas para one-liners ou suítes de software gigantescas.

    
por 03.01.2016 / 22:22
1

@type_outcast

Obrigado por responder. Eu encontrei uma solução que é por isso que escolho a resposta para a minha própria pergunta: Eu encontrei no fórum como excluir todos que começam com uma determinada palavra com

sed '/^test/ d'

Então eu uso "join" com a seguinte linha

sed -i '/^test\b/d' file.txt

que parecem finalmente como

sed /^\btest\b/ d

A última linha de comando permitirá que você exclua todas as linhas que começam com os limites da palavra "teste"

    
por 03.01.2016 / 22:49