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>
如何删除其他“/host”部分?
解决方案
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>
)。
推荐阅读
- javascript - 过滤器和结果显示在同一页面上的消除测验
- python - Flask 中的多线程
- python - Python的第一个参数是什么?sys.argv[0] 或 sys.argv[1]
- css - 使用引导轮播减小文本框背景的大小
- linux - 无法通过 SSH 连接到运行 Alpine Linux 3.10 的 Docker 容器
- homekit - 如何修复在 Homebridge 上加载 Nest 插件时出错?
- python - ValueError:无法将字符串转换为浮点数:''在 Python 3 中
- javascript - 未定义方法mysqli_result,卡在这个错误中
- python - 防止 Jupyter 在普通数学记数法和科学记数法之间切换
- c - 如何反转多行输入?(C)