2013-08-16 7 views
3

Вот что я хотел бы сделать:Заменить часть строк файла, которые соответствуют строки в Bash

У меня есть файл, который ограничен пространством, и у меня есть массив целых чисел. Мне нужно искать каждую строку файла (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: нет предыдущего регулярного выражения Я сомневаюсь, что это лучший способ выполнить задачу (если она даже будет) ... Любая помощь приветствуется, спасибо заранее!

Редактировать: Я использую массив, потому что он фактически будет содержать несколько тысяч записей! Два, которые я вложил в этот сценарий, предназначены только для тестирования.

+0

Можете ли вы показать пример ввода и соответствующий ожидаемый выход? – choroba

+0

Да, вот две строки из файла, который я читаю: '100002; 20182; 36205; 36205; 640; 320201; 2000; 1; 1; ' ' 100003; 10273; 26543; 26543; 640; a60101; 2000; 1; 1; ' Вторая строка имеет совпадение, в конце ее следует читать: ' 100003; 0; 0; 0; 0; 0; 8000; 0; 0; ' – user2690569

ответ

3

Вы могли бы на самом деле сделать это с помощью одной СЭД (если он поддерживает -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;) 
+0

Спасибо за ответ. Я попробовал это, но не нашел/не заменил ни одну из строк в файле. – user2690569

+0

'-r' должен быть помещен перед' -i'. Пожалуйста, попробуйте еще раз. Кроме того, можете ли вы обновить свой пост с помощью результата sed? Version? Благодарю. – konsolebox

+0

Я переместил r перед i, и это сработало! Спасибо, сэр! – user2690569

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