Хотите выделить определенное слово в строке и добавить одну новую строку под этой строкой в файле

#linux #bash

#linux #bash

Вопрос:

Я хочу использовать grep для конкретного слова только в строке object Host ( linux.google.com ) и добавьте новую строку под этой строкой узла объекта. Отображаемое имя = «A: Linux.google.com «

 object Host "linux.google.com" {
import "windows"
address = "linux.google.com"
groups = ["linux"]
}

object Host "kali.google.com" {
import "linux"
address = "linux.google.com"
groups = [linux ]
}

object Host "windows.google.com" {
import "linux"
address = "linux.google.com"
groups = ["windows" ]
}

object Host "os.google.com" {
import "windows"
address = "linux.google.com"
groups = ["linux"]
}
  

Я ищу linux.google.com

Если строка найдена в строке Object Host, я хочу ввести новую строку (отображаемое имя «A: Linux.google.com » ) (Отображаемое имя «B: os.google.com » ), как указано ниже.

 object Host "linux.google.com" {
Display name "A: Linux.google.com"
import "windows"
address = "linux.google.com"
groups = ["linux"]
}

object Host "os.google.com" {
Display name "B: os.google.com"
import "windows"
address = "linux.google.com"
groups = ["linux"]
}
  

Но ищите строку только в строке Object Host, а не в какой-либо другой строке

Ответ №1:

Вы можете сделать это с помощью одной строки в sed :

 > sed -i '/object Host "linux.google.com"/a Display name "A: Linux.google.com"' input.txt
  

Как это работает:

  • Опция -i указывает sed изменить файл на месте (например, вместо того, чтобы создавать временную копию, а затем перезаписывать оригинал временной копией)
  • /object Host "linux.google.com"/ Это sed адрес. Он сообщает, sed с какими строками работать. В данном случае это регулярное выражение. Но sed имеет несколько форм адресов, включая номера строк, диапазоны номеров строк и т.д.
  • a После регулярного выражения адреса находится команда sed добавить. Все, что вы ставите после a , добавляется в строку под той, которая соответствует адресу.

Комментарии:

1. Пожалуйста, взгляните на приведенный выше код, который я отредактировал, и дайте нам рекомендации по требованию @Mike Holt

Ответ №2:

Я не знаю, как это сделать с помощью sed. Однако мы можем сделать следующее.
Пусть input это имя вашего файла и output это выходной файл.

 while IFS= read -r var; do 
  echo "$var"; 
  if [[ $var == *"Host "linux.google.com""* ]]; then 
    echo "Display name "A: Linux.google.com""; 
  fi; 
done < input > output
  

Код очень прост. Он считывает строку вашего файла за строкой и проверяет, есть ли в строке ключевое слово, которое вы хотите сопоставить. Если true, то он печатает то, что вы хотите, в строке ниже.