YAMLファイルから最上位のエントリとその下のすべてのノードを削除する方法は?

YAMLファイルから最上位のエントリとその下のすべてのノードを削除する方法は?

私のファイルには次のエントリが含まれています。

cat /tmp/test.yaml
---
10.8.8.26:
  /tmp/win5835113081224811756.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb

  /tmp/win03745991442278706.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb

10.9.9.26:
  /tmp/conf/extra/httpd-ssl.conf:
    hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2

  /tmp/conf/httpd.conf:
    hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2

など...

test.yamlから特定のIP(例:10.8.8.26)とそのファイルの詳細を削除したいと思います。

次の正規表現は、ファイルから削除したい詳細を取得するのに役立ちますので、checkという変数に保存します。

export check=`grep -Pzo '[^#](^10.8.8.26:)(.|\n)*^(?!( |\n))' /tmp/test.yaml`

echo $check
10.8.8.26: /tmp/win5835113081224811756.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb /tmp/win03745991442278706.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb

次に、変数チェックを使用してファイルからインポートされたエントリを削除したいと思います。

次のコマンドを試しましたが、役に立ちませんでした。

grep -v "$check" /tmp/test.yaml

そして

sed "/${check}/d" /tmp/test.yaml sed: -e expression #1, char 1:
 unterminated address regex

私の要件を満たす方法を提案できますか?

ベストアンサー1

どのくらい行くのでしょうか?

awk -v"DEL=10.8.8.26" '/^[0-9]/ {LP = 1} $0 ~ "^" DEL {LP = 0} LP' file

わかりますか?

努力する

awk -v"DEL=10.9.9.26" '/^[^ ]/ {LP = 1} $0 ~ "^" DEL {LP = 0} LP' file

「IPアドレスがホスト名に変更されている場合」(あなたのコメントから)これを元の質問に含めると便利です。

おすすめ記事