Как заменить строки из одного файла в другой файл - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть один файл, как показано ниже, и он необходим для grep строк, начинающихся с system_props (^ system_props).

JAVA_HOME=`find "$AGENT_HOME/jre" -name release -type f 2>/dev/null | sed "s|/release||g"`

system_props="$system_props -sensu.controller.hostName=abc.nam.net"
system_props="$system_props -sensu.controller.port=8181"
system_props="$system_props -sensu.controller.node=Mcagent"

if [ -z "$JAVA_HOME" ]; then
   if [ -d "/opt/middleware" ]; then
      JAVA_HOME=`find /opt/middleware -type d -name jre 2>/dev/null | grep WebSphere | grep java | grep -v grep | sort | uniq`
   fi
fi

У меня есть другой файл с именем file2, имеющий фиктивное содержимое, как показано ниже.

JAVA_HOME=`find "$AGENT_HOME/jre" -name release -type f 2>/dev/null | sed "s|/release||g"`

system_props="$system_props -sensu.controller.hostName=testhost.net"
system_props="$system_props -sensu.controller.port=8080"

if [ -z "$JAVA_HOME" ]; then
   if [ -d "/opt/middleware" ]; then
      JAVA_HOME=`find /opt/middleware -type d -name jre 2>/dev/null | grep WebSphere | grep java | grep -v grep | sort | uniq`
   fi
fi

Теперь мое требование состоит в том, чтобы заменить содержимое cat file1 | grep ^system_props на cat file2 | grep ^system_props)

ожидаемый результат обоих значений system_props должен быть одинаковым и добавить недостающие строки из файла file1

1 Ответ

0 голосов
/ 17 февраля 2020

РЕДАКТИРОВАТЬ: Поскольку OP немного изменил требование, добавьте отредактированное решение здесь.

awk  '
FNR==NR{
  if(match($0,/^system_props=".*/)){
    a[++count]=substr($0,RSTART+14,RLENGTH-14)
  }
  next
}
match($0,/^system_props="/){
  $0=substr($0,RSTART,RLENGTH) a[++count1]
}
1;
 END{
  if(count!=count1){
    while(++count1<=count){
      print a[count1]
    }
  }
}
' File2 File1


Не могли бы вы попробовать следующее , Это заменит значения из 1 файла в другой файл строкой system_props вхождения. Это означает, что 1-е вхождение строки из File2 будет помещено в первое вхождение строки в File1.

awk  '
FNR==NR{
  if(match($0,/^system_props=".*/)){
    a[++count]=substr($0,RSTART+14,RLENGTH-14)
  }
  next
}
match($0,/^system_props="/){
  $0=substr($0,RSTART,RLENGTH) a[++count1]
}
1
'   Input_file2  Input_file1

Для показанных вами примеров выходные данные будут следующими:

JAVA_HOME=`find "$AGENT_HOME/jre" -name release -type f 2>/dev/null | sed "s|/release||g"`

system_props="$system_props -sensu.controller.hostName=testhost.net"
system_props="$system_props -sensu.controller.port=8080"

if [ -z "$JAVA_HOME" ]; then
   if [ -d "/opt/middleware" ]; then
      JAVA_HOME=`find /opt/middleware -type d -name jre 2>/dev/null | grep WebSphere | grep java | grep -v grep | sort | uniq`
   fi
fi

Объяснение: Добавление подробного объяснения для приведенного выше кода.

awk  '                                            ##Starting awk program from here.
FNR==NR{                                          ##Checking condition if FNR==NR which will be TRUE when file2 is being read.
  if(match($0,/^system_props=".*/)){              ##Checking condition if line has system_props=" then do following.
    a[++count]=substr($0,RSTART+14,RLENGTH-14)    ##Creating array a with index variable count(whose value is increasing with 1) and its value is substring of current line with starting point of RSTART and ending point of RLENGTH.
  }
  next                                            ##next will skip all further lines from here.
}
match($0,/^system_props="/){                      ##Checking condition if a line starts from
  $0=substr($0,RSTART,RLENGTH) a[++count1]        ##Assigning substring of current line from RSTART to RLENGTH and putting value of array a which we collected from previous file.
}
1                                                 ##1 will print edited/non-edited lines of Input_file1 here.
'  File2 File1                                    ##Mentioning Input_file names here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...