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.
Ответы
Ответ 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