Подтвердить что ты не робот

Bash: вставка строки в файл в определенном месте

Я пишу script, который потребует от меня добавления строк в определенной части файла конфигурации. Например

До:

ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900
ServerActors=UWeb.WebServer

После:

ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900
ServerActors=UWeb.WebServer

Как видите, добавлена ​​новая строка. Как мой bash script вставить строку? Я предполагаю, что мне нужно будет использовать sed.

4b9b3361

Ответ 1

Если вы хотите добавить строку после определенного соответствия строки:

$ awk '/master.mplayer.com/ { print; print "new line"; next }1' foo.input
ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900
new line
ServerActors=UWeb.WebServer

Ответ 2

Вы можете использовать что-то вроде этого:

Обратите внимание, что команда должна быть введена через несколько строк, потому что sed не позволяет кодировать новую строку с помощью "\n" или комбинации клавиш Ctrl-V/Ctrl-M, как некоторые инструменты. Обратная косая черта говорит: "Игнорируйте мой удар клавишей возврата, я еще не закончил с моей командой".

sed -i.bak '4i\
This is the new line\
' filename

Это должно сделать трюк (он вставляет его между строками 3 и 4).

Если вы хотите поместить эту команду в оболочку script, вам нужно избежать обратных косых черт, чтобы они не ели от bash и не могли быть переданы sed. Внутри script команда становится:

sed -i.bak '4i\\
This is the new line\\
' filename

Ответ 3

awk 'NR==5{print "new line text"}7' file

Ответ 4

Вы можете добавить его с sed в свой файл filename после того, как определенная строка pattern будет соответствовать:

sed '/pattern/a some text here' filename

в вашем примере

sed '/master.mplayer.com/a \  new line' filename

(обратная косая черта маскирует первое пространство в новой строке, поэтому вы можете добавить больше пробелов в начале)

источник: https://unix.stackexchange.com/a/121166/20661