我有一个drupal网站,该网站将其配置导出到yaml文件中。对于它的Web表单组件,我们有大约200个Web表单,这些表单将密件抄送提交到内部电子邮件地址,以进行跟踪
我们想从所有Web表单中删除该电子邮件,最简单的方法是从yaml配置文件中删除它,然后重新导入它们。
因此,我当前的工作流程是打开其中一个文件,找到具有的行,email_webdev:
然后将其删除,然后删除接下来的42行,保存文件,打开下一个,清洗,重复约200个文件。
我正在寻找一种单行代码或脚本,该脚本或脚本将自动从出现它们的所有文件中删除一组相同的42行的有序集合。
在我们的config目录中,有大约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行。
有没有更简单的方法可以做到这一点?
请先尝试此操作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:
行尾字符。
一旦检测到该行,它将设置为n=42
,从而停止打印该行,然后仅在计数了42行之后才再次开始打印。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句