【问题标题】:Add text next to a word - Unix在单词旁边添加文本 - Unix
【发布时间】:2015-09-18 10:52:23
【问题描述】:

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

要搜索的行 - 听 29399

要添加的行

服务器名称服务器 SSL启用 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

非常感谢。

【问题讨论】:

  • 您的sed 不支持-i(倾斜编辑)
  • 那么,你能不能给我一个方法?
  • 尝试不使用-i,即sed '/Listen 29399/a &lt;VirtualHost Servername:29399&gt;\n SSLEnable\n #SSLClientAuth none\n &lt;/VirtualHost&gt;\n SSLServerCert ServerCert\n KeyFile KeyFile /test/script/scripts' httpd.conf
  • 它给出的错误是 sed '/Listen 29399/a \n SSLEnable\n #SSLClientAuth none\n \n SSLServerCert ServerCert\n KeyFile KeyFile /test/无法解析脚本/脚本'...请帮助
  • 您是要附加文本还是替换?您应该决定要执行哪一个并删除问题的另一部分。

标签: shell sed aix


【解决方案1】:

关于 -i 开关的问题放在一边(您的 sed 版本可能不支持它),the standard syntax 使用 sed 追加行是这样的:

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

这是a\,后跟一个换行符,然后是要附加的文本。某些版本的 sed 允许您指定要在同一行附加的文本,有些则不允许 - 这是一种可移植的方式。此外,并非所有版本的 sed 都能理解 \n - 您可以在每行末尾添加一个 \ 以附加一个多行字符串,如我所示。

如果您觉得这很麻烦,请改用 awk:

awk '{print}/Listen 29399/{print "multi-line text\nto be inserted"}' file

使用任一方法,要实现“就地”编辑,只需重定向到一个临时文件,然后覆盖原始文件,即cmd orig &gt; tmp &amp;&amp; mv tmp orig


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

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 表示输入的每一行都被打印出来。

【讨论】:

  • 太棒了:)...非常感谢
  • 不客气 - 我再次编辑以展示一种使用 sed 的方法,它也可能对您有用(但我个人更喜欢将 awk 与 \n 一起使用)。如果您的问题通过点击旁边的勾号得到解决,请不要忘记接受我的回答。
【解决方案2】:

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的转义序列,我在vi中加上CTRL-V ESC

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多