3

这是我想做的:

我有一个以空格分隔的文件,并且我有一个整数数组。我需要在文件(inv.txt)的每一行中搜索数组中的每个元素。如果找到模式,我需要保留该行的前 7 个字符,并将其余字符替换为“0;0;”

我对脚本很陌生,到目前为止我尝试过的是:(我想我有点偏离了轨道)

removing=(3199 26543)
for line in inv.txt
do
   for i in "${#removing[@]}"
   do
       sed -i "s/${removing[$1]/c\ ${line:0,7}      0;      0;/g inv.txt
   done
done

这给了我一个 sed -e 表达式 #1 char 0: no previous regular expression 我怀疑这是完成任务的最佳方式(如果它甚至会的话)......感谢任何帮助,提前致谢!

编辑:我正在使用一个数组,因为它实际上将包含几千个条目!我在这个场景中放入的两个只是为了测试。

4

3 回答 3

3

你实际上可以用一个 sed 来做到这一点(如果它支持 -r):

sed -rie '/3199|26543/s/^(.{7}).*/\1\t0;\t0;/' inv.txt

使用数组:

#!/bin/bash
removing=(3199 26543)
( IFS='|'; sed -rie "/${removing[*]}/s/^(.{7}).*/\\1\\t0;\\t0;/" inv.txt; )
于 2013-08-16T20:13:31.290 回答
0

你可以尝试这样的事情:

removing=(3199 26543)
>output
while read line
do
   for i in "${removing[@]}"
   do
       if [[ "$line" =~  ^.*\ ${i}\  ]]; then
          echo "${line:0:7} 0; 0;" >> output
       else
          echo "$line" >> output    
       fi
   done
done < inv.txt

# you can uncomment below mv command if you want to overwrite inv.txt
# mv output inv.txt
于 2013-08-16T21:03:36.660 回答
0
sed  -i '/3199\|26543/s/^\(.\{7\}\).*/\1\t0\t0/' inv.txt
于 2013-08-18T08:03:45.060 回答