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

У меня есть один файл, как в примере ниже, и у меня есть требование grep строки, начинающиеся с system_props (cat file1 | grep ^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

У меня есть другой файл с именем say 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 должен быть добавлен в файл2, который в файле1 в той же последовательности.

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"

Ответы [ 3 ]

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

Я дал это go, не глядя на существующие ответы, и придумал примерно тот же ответ, что и Равиндер.

awk '
FNR == NR  { 
  line[FNR] = $0 
  next 
}  
/^system_props/  { 
  if (!nocopy) 
    for (x = 0 ; x < length(line) ; x++ ) 
      print line[x]  
  nocopy=1 
  next 
} 
{ 
  print 
} '  <( grep ^system_props file1 )  file2

Лично мне больше нравится решение Равиндера. Его переменная count совпадает с моей переменной nocopy. И он использует одну переменную для захвата system_props из первого файла, тогда как я использую массив.

Кроме того, Ravinder ищет строки «^ system_props» в awk, тогда как я возлагаю эту ответственность на grep. Однако некоторые могут подумать, что синтаксис <(), который я использую для grep, может быть излишне сложным. </p>

Я также заметил, что Равиндер использовал идиому awk 1, чтобы всегда указывать печать, что эквивалентно тому, что я прописал с {print}. Мне нравится подход Равиндера, потому что он короче (хотя, возможно, менее очевиден для читателя).

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

Не могли бы вы попробовать следующее. Написано и протестировано с образцами.

awk '
FNR==NR{
  if(match($0,/system_props="/)){
    val=(val?val ORS:"")$0
  }
  next
}
/^system_props="/{
  if(++count==1){
    print val
  }
next
}
1
'  Input_file1   Input_file2

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

awk '                                ##Starting awk program from here.
FNR==NR{                             ##Checking condition FNR==NR which will be TRUE when Input_file1 is being read.
  if(match($0,/system_props="/)){    ##Checking condition if match for string system_props=" is found in current line then do following.
    val=(val?val ORS:"")$0           ##Creating variable val and keep appending current line value to its value here.
  }
  next                               ##next will skip all further statements from here.
}
/^system_props="/{                   ##Checking condition if line is starting from sting system_props=" then do following.
  if(++count==1){                    ##Checking condition if variable count is 1 then do following.
    print val                        ##Printing val variable here.
  }
  next                               ##next will skip all further statements from here.
}
1                                    ##1 will print edited/non-edited line here.
'  file1  file2                      ##Mentioning Input_file names here.
0 голосов
/ 17 февраля 2020

Вы хотите объединить три сегмента файла:
1. Второй файл до первого ^system_props
2. Строки из первого файла с ^system_props
3. Второй файл после последний ^system_props

# Part 1
sed '/^system/,$ d' file2
# Part 2
grep '^system' file1
# Or sed -n '/^system/p' file1
# Part 3
sed '1,/^system/d; /^system/ d' file2

Вместе:

sed '/^system/,$ d' file2; grep '^system' file1; sed '1,/^system/d; /^system/ d' file2

Этот подход также может быть реализован с awk:

awk -F= 'BEGIN {show=1}
         ARGIND==1 && $1=="system_props" {show=0}
         ARGIND==2 {show=($1=="system_props" ? 1:0)}
         ARGIND==3 && $1=="system_props" {show=1; next}
         show {print}' file2 file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...