在单词旁边添加文本 - Unix

时间:2015-07-01 10:21:19

标签: shell sed aix

我想搜索一行,然后在它旁边添加三行,我使用sed但它给我错误,PFB要求

要搜索的行 - 收听29399

要添加的行

ServerName服务器 SSLEnable KeyFile / test / script / scripts

我使用的脚本,

sed -i '/Listen 29399/a <VirtualHost Servername:29399>\n SSLEnable\n #SSLClientAuth none\n </VirtualHost>\n SSLServerCert ServerCert\n KeyFile KeyFile /test/script/scripts' httpd.conf

错误:

sed: illegal option -- i
Usage:  sed [-n] [-u] Script [File ...]
sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]

请帮忙。

AIX服务器

更新

请告诉我如何用其他三行代替一行,如下所示 源文件:

Listen 29399

结果文件内容:

Listen 29499
<VirtualHost Sever:25344>
Key File=/test/script

谢谢你。

2 个答案:

答案 0 :(得分:2)

关于onRestoreInstanceState()转换的问题(您的sed版本可能不支持它),the standard syntax使用sed追加行是这样的:

-i

那是sed '/Listen 29399/a\ <VirtualHost Servername:29399>\ SSLEnable\ #SSLClientAuth none\ </VirtualHost>\ SSLServerCert ServerCert\ KeyFile KeyFile /test/script/scripts' httpd.conf ,后跟换行符,后跟要追加的文字。某些版本的sed允许您指定要在同一行上追加的文本,有些则不允许 - 这是可移植的方法。此外,所有版本的sed都无法理解a\ - 您可以在每行的末尾添加\n以附加我所显示的多行字符串。

如果这对您来说似乎很麻烦,请改用awk:

\

使用任一方法实现“就地”编辑,只需重定向到临时文件,然后覆盖原始文件,即awk '{print}/Listen 29399/{print "multi-line text\nto be inserted"}' file

如果不是附加文本,而是你想要的替换,那么你可以像这样使用sed:

cmd orig > tmp && mv tmp orig

我已使用sed 's~Listen 29399~Listen 29499\ <VirtualHost Sever:25344>\ Key File=/test/script~' file 分隔~命令的各个部分,以避免需要转义所有s。同样,替换中的每一行都以/结束。

或者,使用awk:

\

实际上它是相同的替换,只是使用awk '{sub(/Listen 29399/, "Listen 29499\n<VirtualHost Sever:25344>\n<VirtualHost Sever:25344>")}1' file 换行。命令末尾的\n表示输入的每一行都被打印出来。

答案 1 :(得分:0)

Vi不是您通常想要用脚本编辑文件的工具,但它是另一种方式(首先确保搜索将成功使用grep而Listen不是最后一行,正如我所说不使用它):

vi httpd.conf >/dev/null 2>&1 <<END
/Listen 29399
iVirtualHost Servername:29399
SSLEnable
#SSLClientAuth none
</VirtualHost>
SSLServerCert ServerCert
KeyFile KeyFile /test/script/scripts
**ESC**:wq!
END

ESC 是ESC的转义序列,我使用CTRL-V ESC在vi中添加它。

相关问题