remove linha se a palavra iniciar na linha

0

estamos tentando excluir a linha que começou com a palavra "conteúdo", mas sem sucesso

A palavra "content" pode começar no começo do arquivo ou depois de espaços ou TAB

o que há de errado na sintaxe do sed?

 sed  "/^[ \t]*"content"\b/Id" file.txt

  "version" : 9,
  "Config" : {
    "cluster_name" : "HDP",
    "stack_id" : "HDP"
  },
  "properties" : {
    "content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# 
  "kafka_user_nproc_limit" : "65536"
.
.

saída esperada do arquivo.txt

  "version" : 9,
  "Config" : {
    "cluster_name" : "HDP",
    "stack_id" : "HDP"
  },
  "properties" : {
  "kafka_user_nproc_limit" : "65536"
.
.
    
por yael 10.06.2018 / 14:56

3 respostas

4

Não há necessidade de sed se tudo o que você está fazendo é filtrar linhas com base em padrões. É para isso que grep :

grep -iv '^[[:space:]]*"content"' < file.txt

grep -i , ao contrário do sinalizador de endereço I , é padrão.

Ou, se esse for um arquivo JSON adequado, você pode usar um utilitário de análise JSON como jq para excluir essa chave:

jq 'del(.properties.content)' < file.txt
    
por 10.06.2018 / 17:51
2

Eu vejo dois problemas aqui:

  1. as aspas duplas no padrão não serão correspondidas porque você usou aspas duplas para incluir a expressão
  2. " é um caractere sem palavra, então não haverá uma palavra limite depois

Então

sed  '/^[ \t]*"content"/Id' file.txt

ou (se você precisar usar aspas duplas em torno da expressão)

sed  "/^[ \t]*\"content\"/Id" file.txt
    
por 10.06.2018 / 15:03
0

só podemos fazer usando o comando abaixo

sed -e  '/^\s*"content"/d'  file.txt

saída

"version" : 9,
  "Config" : {
    "cluster_name" : "HDP",
    "stack_id" : "HDP"
  },
  "properties" : {
  "kafka_user_nproc_limit" : "65536"
.
.
    
por 10.06.2018 / 19:00