設定を 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行を計算した後にのみ印刷を再開するように設定されます。