如何使用sed替换包含斜杠的字符串?

时间:2018-08-23 04:53:36

标签: linux 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>

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

2 个答案:

答案 0 :(得分:1)

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

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

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

脚本解剖:

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

是搜索/替换形式。搜索的是第一个和第二个“ /”之间的位。第二和第三之间的位是您要替换的位。最后一部分是您要应用于替换的所有命令。

搜索

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

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

替换

\1

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

命令

p

打印结果行(替换后)。

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

答案 1 :(得分:0)

我认为这个sed就足够了

sed 's/<[/]*host>//g' infile