2

我正在使用 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。如何使用此数组搜索匹配项,但在搜索中包含空格(和“;”)?任何帮助将不胜感激!

编辑:样本输入

  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
4

3 回答 3

2

除非我误解了要求,否则只需执行以下操作:

$ 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
于 2013-08-21T13:48:27.680 回答
1

很棒的剧本!

问题在于使用管道以及数组变量。

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'开关...

于 2013-08-22T06:59:33.883 回答
1

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

$ 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

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

于 2013-08-21T14:09:13.473 回答