単語が行から始まる場合、行を削除

単語が行から始まる場合、行を削除

「content」という単語で始まる行を削除しようとしましたが、成功しませんでした。

「content」という単語は、実際にはファイルの先頭または空白またはタブの後ろから始めることができます。

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"
.
.

file.txtの期待される出力

  "version" : 9,
  "Config" : {
    "cluster_name" : "HDP",
    "stack_id" : "HDP"
  },
  "properties" : {
  "kafka_user_nproc_limit" : "65536"
.
.

答え1

sed実行中のアクションがパターンに従って行をフィルタリングするだけであれば、これを行う必要はありません。grep目的は次のとおりです。

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

grep -iI標準アドレスフラグとは反対です。

あるいは、これが正しいJSONファイルの場合は、JSON解析ユーティリティを使用してjqキーを削除できます。たとえば、次のようになります。

jq 'del(.properties.content)' < file.txt

答え2

これには2つの問題があります。

  1. 式を囲むために二重引用符を使用しているため、パターンの二重引用符が一致しません。
  2. "言葉ではなく文字なので言葉はありません。境界その後

だから

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

または(式の周りに二重引用符を使用する必要がある場合)

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

答え3

次のコマンドを使用してこれを実行できます。

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

出力

"version" : 9,
  "Config" : {
    "cluster_name" : "HDP",
    "stack_id" : "HDP"
  },
  "properties" : {
  "kafka_user_nproc_limit" : "65536"
.
.

関連情報