「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 -i
、I
標準アドレスフラグとは反対です。
あるいは、これが正しいJSONファイルの場合は、JSON解析ユーティリティを使用してjq
キーを削除できます。たとえば、次のようになります。
jq 'del(.properties.content)' < file.txt
答え2
これには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"
.
.