我使用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
答案 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'开关...