ディレクトリ内のファイルセットから同じ行セットを削除する

ディレクトリ内のファイルセットから同じ行セットを削除する

設定を yaml ファイルにエクスポートする drupal Web サイトがあります。 Webフォームコンポーネントの場合、追跡用に内部電子メールアドレスに参照として送信する約200のWebフォームがあります。

すべてのWebフォームからこのメールを削除したいと思います。最も簡単な方法は、yaml設定ファイルからそのEメールを削除してから再インポートすることです。

だから私の現在のワークフローはファイルの1つを開き、その中に含まれている行を見つけ、email_webdev:そのファイルと次の42行を削除し、ファイルを保存し、次の行を開いて、すすぎ、約200個のファイルを繰り返しますすることです。

私は表示されるすべてのファイルから同じ42行の順序付きセットを自動的に削除する単一行またはスクリプトを探しています。

技術的な説明

構成ディレクトリには、同じ行セットを削除したい約200個のファイルがあります。

$ ls webform.webform.*
webform.webform.incoming_student_housing_applica.yml
webform.webform.info_for_students.yml
webform.webform.info_request_for_viewbook.yml
webform.webform.inquire_about_a_project.yml

各Webform構成yamlは、インデントされた数百行の構成データであり、デフォルトの形式を持ちます。以下は、行番号の前に抜粋した例です。

....
170   test:
171     roles: {  }
172     users: {  }
173     permissions: {  }
174   configuration:
175     roles: {  }
176     users: {  }
177     permissions: {  }
178 handlers:
179   email_webdev:
180     id: email
181     label: 'Webdev Email'
182     handler_id: webdev_email
183     status: true
184     conditions: {  }
185     weight: 0
186     settings:
... 
214       parameters: {  }
215 variants: {  }
216 uuid: 6073470f-bb3b-40ad-8440-a7cb5f3be4d2

上記の抜粋の179-214行目の42行目のセクションは、ディレクトリ内の200個以上のファイルから削除したい部分です。だから私が手動でしたのは、vimから179-214行を削除して保存することでした。結果は次のとおりです。

...
170   test:
171     roles: {  }
172     users: {  }
173     permissions: {  }
174   configuration:
175     roles: {  }
176     users: {  }
177     permissions: {  }
178 handlers:
179 variants: {  }
180 uuid: 6073470f-bb3b-40ad-8440-a7cb5f3be4d2

長さは42行です。 42行はファイル間で同じで順序も同じですが、セクションはファイル内の異なる場所から始まります。たとえば、あるファイルでは1068行で始まり、別のファイルでは872行で始まります。

$ grep -n email_webdev *
webform.webform.404.yml:183:  email_webdev:
webform.webform.accommodations_letter_request_fo.yml:219:  email_webdev:
webform.webform.agency_survey.yml:219:  email_webdev:
...

私が理解できるのは、grepスイッチを使用して-Aパターンマッチング後の行を見つけることだけです。

$ grep -A42  email_webdev *
webform.webform.volunteer_sign_up.yml:  email_webdev:
webform.webform.volunteer_sign_up.yml-    id: email
webform.webform.volunteer_sign_up.yml-    label: 'Webdev Email'
webform.webform.volunteer_sign_up.yml-    handler_id: webdev_email
webform.webform.volunteer_sign_up.yml-    status: true
webform.webform.volunteer_sign_up.yml-    conditions: {  }
webform.webform.volunteer_sign_up.yml-    weight: 0
webform.webform.volunteer_sign_up.yml-    settings:
...

したがって、以下はこのファイル(およびディレクトリ内のすべてのファイル)から削除したい行です。しかし、、他のメール応答に表示されるため、行を削除することも、id: email他の行のパターンを一致させることもできません。たとえば、他のほとんどすべてのweight: 0要素にも表示されますconditions: { }。彼らはこのセクションの行だけを読むことができます。このセクションはemail_webdev:すべてのファイルで同じで、次の42行で始まり続けます。

これを行うより簡単な方法はありますか?

ベストアンサー1

まず、これを試して、生成された新しいファイルが要件を正確に満たしていることをmv確認してください。元のファイルの上書きを.out再度有効にします。mv

for file in webform.webform.*; do
    awk '/^  email_webdev:$/{n=42}{if(!n){print}else{n--}}' "$file" > "$file.out"
    mv -- "$file.out" "$file"
done

awkスクリプトが行を検出します正確にこのように:

  email_webdev:

つまり、行末email_webdev:文字である2つのスペースです。

ラインが検出されると、n=42そのライン印刷を停止し、42行を計算した後にのみ印刷を再開するように設定されます。

おすすめ記事