我有一个文本文件,其中包含很多乱七八糟的文本。
我使用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>
如何删除其他“ /主机”部分?
答案 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