首页 > 解决方案 > 如何使用 sed 替换包含斜杠的字符串?

问题描述

我有一个包含大量混乱文本的文本文件。

我使用 grep 来获取包含这样的字符串 prod 的所有文本

cat textfile | grep "<host>prod*"

结果

<host>prod-reverse-proxy01</host>
<host>prod-reverse-proxy01</host>
<host>prod-reverse-proxy01</host>

不断地,我使用 sed 来删除所有“主机”部分

cat textfile | grep "<host>prod*" | sed "s/<host>//g"; "s/</host>//g"

但只有第一个“主机”被删除。

prod-reverse-proxy01</host>
prod-reverse-proxy01</host>
prod-reverse-proxy01</host>

如何删除其他“/host”部分?

标签: linuxsed

解决方案


sed -n -e "s/^<host>\(.*\)<\/host>/\1/p" textfile

sed 可以直接处理您的文件。无需 grep 或 cat。

-n 用于抑制任何不匹配的行。脚本中的最后一个“p”将打印所有匹配的文件。

脚本剖析:

s/.../.../... 

是搜索/替换形式。第一个和第二个“/”之间的位就是您要搜索的内容。第二个和第三个之间的位是您替换它的位置。最后一部分是您要应用于替换的任何命令。

搜索

^<host>\(.*\)<\/host>

查找以 开头的所有行,<host>后跟任何文本(.*),后跟</host>. <host>和之间的任何文本</host>都使用“(”和“)”存储到内部变量“1”中。请注意, (, ) 和 / (in </host>) 必须转义。

替换

\1

用变量 1 的内容替换找到的文本(必须转义 1,否则,所有内容都将替换为字符 '1'。

命令

p

打印结果行(替换后)。

注意:您的搜索涉及删除两个相似但不相同的字符串 (<host></host>)。


推荐阅读