首页 > 解决方案 > 如何删除与数组中共享的字符串匹配的行

问题描述

我有一个文件,其中包含如下文本

compile_tool/opt/CSDTK/bin/chipgen/Modem2G/toolpool/plugins/Calib/libcalibplugin.so
compile_tool/opt/CSDTK/bin/chipgen/Modem2G/toolpool/plugins/Calib/libcalibplugin.dill
compile_tool/opt/CSDTK/bin/lib/ruby/gems/1.8/gems/builder-2.1.2/Rakefile.pg
compile_tool/opt/mingw32_3.4.4/usr/i586-mingw32msvc/include/mmsystem.c
compile_tool/opt/mingw32_3.4.4/usr/i586-mingw32msvc/include/winnt.h
compile_tool/opt/CSDTK/bin/lib/ruby/gems/1.8/gems/builder-2.1.2/test/test_xchar.HEX

我想删除文件扩展名为 .so 、 .dill 、.pg 和 .HEX 的行。我试过下面的代码,但没有弄明白。

#! /bin/bash
array=(.a .so .bin.ihex .dll .exe .gem .bin .png .HEX)
for a in "${array[@]}"
do 
sed -i -e "/\$a\b/d" copyright
done 

标签: linuxbash

解决方案


如果您sed支持\| (or)正则表达式中的运算符,请尝试:

array=(.a .so .bin.ihex .dll .exe .gem .bin .png .HEX)
pat="$(IFS='|'; echo "${array[*]}" | sed -e 's/|/\\|/g' -e 's/\./\\./g')"
sed "/\($pat\)\$/d" copyright
  • 它连接数组元素并生成一个模式字符串,如下所示:\.a\|\.so\|\.bin\.ihex\|....
  • 然后该行sed "/\($pat\)\$/d" text删除与模式匹配的行。

请注意,您的数组元素和您的文本"line which is having file extension .so , .dill ,.pg and .HEX"可能不一致。我按原样使用了你array的。


推荐阅读