繁体   English   中英

如何使用带有图案的bash删除文件中的行块并将剩余的行保存到另一个文件中

[英]How to delete blocks of lines in a file using bash with a pattern and save the remaining on another file

我目前正在研究一个脚本,该脚本将从file1.txt中删除具有特定模式的行块,并将其余部分保存在file2.txt中 以下是file1.txt的示例:

dn: fssecPermissionId=FSNASVIEW,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: FSNASVIEW
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_1

dn: fssecPermissionId=FSNASMANAGE,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: FSNASMANAGE
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_2

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=CMPlanManagementmonitor,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: CMPlanManagementmonitor
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_4

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

我想使用fssecPermissionId=FSNASVIEWfssecPermissionId=FSNASMANAGEfssecPermissionId=CMPlanManagementmonitor删除块

请注意,我想删除超过70个fssecPermissionId值,为简单起见,我仅举几个例子。 我也在想那70个值将以某种方式存储在数组中,但我不知道该怎么办。

以下是将保存到file2.txt的预期输出

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

提前非常感谢您的帮助。

您可以将awk与空RS

awk -v RS= -v ORS='\n\n' '!/fssecPermissionId=(FSNASVIEW|FSNASMANAGE|CMPlanManagementmonitor)/' file

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

要保存更改,请检查: awk将修改保存到位


编辑:如果要处理大量的排除模式,则使用所有要排除的字符串创建一个名为excl.txt的文件,如下所示:

cat excl.txt
FSNASVIEW
FSNASMANAGE
CMPlanManagementmonitor

然后使用以下awk命令:

awk -F, -v ORS='\n\n' 'NR==FNR {
   ex["dn: fssecPermissionId=" $1]
   next
}
!($1 in ex)' excl.txt RS= file

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

文件:

dn: fssecPermissionId=FSNASVIEW,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: FSNASVIEW
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_1

dn: fssecPermissionId=FSNASMANAGE,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: FSNASMANAGE
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_2

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=CMPlanManagementmonitor,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: CMPlanManagementmonitor
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_4

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

sed

sed -r /"fssecPermissionId=(FSNASVIEW|FSNASMANAGE|CMPlanManagementmonitor)"/,+4d file

输出:

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM