2015-03-13 2 views
0

Я ищу способ заменить запись, найденную с awk, с новой записью непосредственно в файле. ПоэтомуBash найти и заменить запись в файле awk

cat file 

    public function method1() 
    { 
     return 1; 
    } 

    /** 
    * old comment 
    */ 
    public function oldMethod() 
    { 
     return 'old'; 
    } 

    public function method3() 
    { 
     return 3; 
    } 

AWK возвращает

awk 'BEGIN{RS="\n\n"; IGNORECASE=1} /oldMethod/ {print $0}' file 
    /** 
     * old comment 
     */ 
    public function oldMethod() 
    { 
     return 'old'; 
    } 

UPDATE ожидаемый результат т.д .:

cat file 

    public function method1() 
    { 
     return 1; 
    } 

    /** 
    * new comment 
    */ 
    public function newMethod() 
    { 
     /*Do some fancy stuff here*/ 
     return 'another output'; 
    } 

    public function method3() 
    { 
     return 3; 
    } 

Теперь я хочу, чтобы заменить этот метод с методом, содержащейся в переменной. Я понятия не имею, как это достичь. У кого-нибудь хорошая идея?

С наилучшими пожеланиями nTOXIC

+0

Каков ваш ожидаемый выход? –

+0

Обновлен мой запрос с помощью примера вывода после замены oldMethod() – nTOXIC

+0

Обновлены примеры, поясняющие, что это вопрос не только о замене частей слов. – nTOXIC

ответ

1

Все, что вам нужно:

awk -v new="$var" -v RS= -v ORS='\n\n' '/oldMethod/{$0=new}1' file 

См:

var=$(cat << '_EOF_' 
/** 
* new comment 
*/ 
public function newMethod() 
{ 
    /*Do some fancy stuff here*/ 
    return 'another output'; 
} 
_EOF_ 
) 

.

$ awk -v new="$var" -v RS= -v ORS='\n\n' '/oldMethod/{$0=new}1' file 
public function method1() 
{ 
    return 1; 
} 

/** 
* new comment 
*/ 
public function newMethod() 
{ 
    /*Do some fancy stuff here*/ 
    return 'another output'; 
} 

public function method3() 
{ 
    return 3; 
} 

Просто измените /oldMethod/ к однако большая часть старой записи, которую вы хотите найти, если он должен быть больше, чем это. Если вы хотите, чтобы указать, что в переменном слишком просто изменить командную строку на:

awk -v new="$var" -v old="oldMethod" -v RS= -v ORS='\n\n' '$0~old{$0=new}1' file 

Для сравнения с ответом @ anishane в, если у вас «новая» запись в файл вместо переменного все, что вы хотите необходимо:

awk -v RS= -v ORS='\n\n' 'NR==FNR{new=$0;next} /oldMethod/{$0=new}1' newfile.c input.c 
2
$ cat input.c 

public function method1() 
{ 
    return 1; 
} 

/** 
* old comment 
*/ 
public function oldMethod() 
{ 
    return 'old'; 
} 

public function method3() 
{ 
    return 3; 
} 

-

$ cat newfile.c 
/** 
* new comment 
*/ 
public function newMethod() 
{ 
    /*Do some fancy stuff here*/ 
    return 'another output'; 
} 

-

$ awk -v RS= -v ORS=$'\n' 'NR==FNR{a=a $0 "\n"; next;}/oldMethod/{print ORS a; next;}1' newfile.c input.c 

public function method1() 
{ 
    return 1; 
} 

/** 
* new comment 
*/ 
public function newMethod() 
{ 
    /*Do some fancy stuff here*/ 
    return 'another output'; 
} 

public function method3() 
{ 
    return 3; 
} 

Объяснение:

  1. -v RS= Установить RS в пустую строку: означает отдельные записи пустых строк.
  2. -v ORS=$'\n' Выходной разделитель записи.
  3. 'NR==FNR{a=a $0 "\n"; next;}' Захват первого файла в переменной с именем a. Перейдите к следующей записи.
  4. '/oldMethod/{print ORS a; next;}1' Для записи соответствия/рисунка /, печати a. Дополнительная печать.
  5. newfile.c - это первый файл. input.c - это второй файл в списке аргументов.
+0

Ты сделал свой день. Спасибо :) – nTOXIC

+0

Почему вы устанавливаете 'ORS = $ '\ n'', когда это значение по умолчанию?Почему вы иногда используете явный '' \ n "' в тексте и в других случаях ORS? Почему вы пытаетесь добавить к 'a' (' a = a $ 0 "\ n"), когда весь файл 'newfile.c' будет считан как одна запись? Это очень запутанный код ... Я добавил более простую версию до конца моего ответа. –

+0

@EdMorton: '« Почему вы пытаетесь добавить к (a = a $ 0 "\ n"), когда весь файл newfile.c будет считан как одна запись? ': Это правда в этом случае. Не обязательно всегда верно. OP может захотеть расширить файл newfile.c, чтобы содержать больше функций ... – anishsane

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