2016-11-11 3 views
-1

Привет, мне нужно отредактировать некоторый файл, но я не хочу делать это вручную, я знаю, что с помощью команды sed я могу редактировать файлы с помощью командной строки, но в этом случае я не знаю, как сопоставить шаблон для редактирования. например, у меня есть этот файл:bash заменить многострочный текст в файле с шаблоном

(
    AMI1 
    { 
     type   patch; // <- relpace patch by cyclicAMI; 
     nFaces   1350; 
     startFace  2433406; 
    } 
    inlet 
    { 
     type   patch; 
     nFaces   1125; 
     startFace  2434756; 
    } 
    outlet 
    { 
     type   patch;  
     nFaces   1125; 
     startFace  2435881; 
    } 
    AMI2 
    { 
     type   patch; // <- relpace patch by cyclicAMI; 
     nFaces   2850; 
     startFace  2440606; 
    } 
) 

И я хочу, чтобы редактировать ТОЛЬКО ключи AMI выглядеть следующим образом:

(
    AMI1 
    { 
     type   cyclicAMI;  // <-- Replaced 
     inGroups  1(cyclicAMI); // <-- Add 
     nFaces   1350; 
     startFace  2433406; 
     matchTolerance 0.0001;   // <-- Add 
     transform  noOrdering;  // <-- Add 
     neighbourPatch AMI2;   // <-- Add AMI2 in AMI1 
    } 
    inlet 
    { 
     type   patch; 
     nFaces   1125; 
     startFace  2434756; 
    } 
    outlet 
    { 
     type   patch; 
     nFaces   1125; 
     startFace  2435881; 
    } 
    AMI2 
    { 
     type   cyclicAMI;  // <-- Replaced 
     inGroups  1(cyclicAMI); // <-- Add 
     nFaces   2850; 
     startFace  2440606; 
     matchTolerance 0.0001;   // <-- Add 
     transform  noOrdering;  // <-- Add 
     neighbourPatch AMI1;   // <-- Add AMI1 in AMI2 
    } 
) 

ответ

1

Не слишком элегантный, но работает.

state=0 
while IFS= read -r line; do 
    case "${line// }" in 
     AMI[12]) state=${line##*AMI} 
       echo "$line";; 
     typepatch\;*) echo "  type   cyclicAMI;" 
         echo "  inGroups  1(cyclicAMI);";; 
        else 
         echo "$line" 
        fi;; 
     \}) if [ "$state" != 0 ]; then 
       echo "  matchTolerance 0.0001;" 
       echo "  transform  noOrdering;" 
       echo "  neighbourPatch AMI$((3-state));" 
       echo " }" 
       state=0 
      else 
       echo " }" 
      fi;; 
     *) echo "$line" 
    esac 
done < textfile.txt 
+0

спасибо за ваш ответ, но результат в закрывающей скобке 'inlet' и' outlet' ключа и последней скобку, отсутствует – efirvida

+0

@efirvida упс! Исправлена. – hidefromkgb

+0

Большое спасибо, недостающая конечная скобка была моей ошибкой, удалив последнюю пустую строку. THANKS !!, теперь все в порядке – efirvida

Смежные вопросы