使用带有数组的sed来搜索字符串加空格

时间:2013-08-21 13:28:47

标签: linux bash sed whitespace

我使用sed替换了多个文件中的多行,而且我遇到了问题。我使用数组给sed许多命令,但需要在搜索中包含几个空格以防止sed表单查找和删除太多行。 代码:

( IFS='|'; sed -rie "/  ${points_r[*]};/d" io_points.dat4; )

两个空格和";"是为了帮助避免删除我不需要删除的行。这些行被删除了,所以我也尝试了这个:

( IFS='|'; sed -rie "/\s\{2,\}${points_r[*]};/d" io_points.dat4; )

我的bash版本是3.2.25,sed版本是4.1.5。如何使用此数组搜索匹配项,但在搜索中包含空格(以及&#39 ;;')?任何帮助将不胜感激!

编辑:示例输入

  2;  14; 1;I;   0;  1;  0;  66
  3;  14; 1;I;   0;  1;  0;  141
  4;  14; 1;I;   0;  1;  0;  23
  5;  14; 1;I;   0;  1;  0;  26
  7;  14; 1;I;   0;  1;  0;   0

points_r包含数字3 4和5,我需要删除包含3的行; 4;和5; (第一栏)但不是2;或7; (它们在第二列中包含4个)

输出将是:

2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0

3 个答案:

答案 0 :(得分:1)

除非我误解了要求,否则只需:

$ awk '/^[27];/' file
2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0

sed

$ sed '/^[27];/!d' file
2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0

事实上,如果是这种情况,您只需要grep

$ grep '^[27];' file
2;  14; 1;I;   0;  1;  0;  66
7;  14; 1;I;   0;  1;  0;   0

答案 1 :(得分:0)

如果您希望值在数组中,请尝试使用此脚本

$ echo "${points_r[@]}"
2 3 4

$ awk -F'[ ;]+' -v p="${points_r[*]}" 'BEGIN{split(p,a," ");for (i in a) b[a[i]]=1}!($2 in b)' file
  2;  14; 1;I;   0;  1;  0;  66
  7;  14; 1;I;   0;  1;  0;   0

请注意,这只适用于单字数组元素。

答案 2 :(得分:0)

很棒的剧本!

问题在于使用管道,还有数组变量。

3.2 shell以不同的方式扩展它们。

将数组分配给另一个变量,这样您就不必在sed命令中进行数组扩展(可能没有必要,但会使事情变得更容易):

arr=$points_r[*]

现在对'arr'变量进行shell替换以获取管道:

arr2="${arr// /|}"

然后用你拥有的东西,这很酷。

我的shell提示符是“>>>”,我在此工作之前取消设置IFS和OFS;出于某种原因,他们是管道......

>>> x="${points_r[*]}"
>>> echo $x
3 4 5
>>> y="${x// /|}"
>>> echo $y
3|4|5

使用$ y运行sed命令。

(IFS不会被传递给sed,我想。它收到3 4 5)

对于您使用的sed行,您需要将正则表达式括在()中,以便它是一个匹配组,(3或4或5)

sed -re "/  (${y});/d" io_points.dat4;
  2;  14; 1;I;   0;  1;  0;  66
  7;  14; 1;I;   0;  1;  0;   0

我没有使用'i'开关...