如何使用 sed 提取此类模式?
这是我的道路:/sample/xyz/logs/test.logs
输出应该是:xyz
如果路径不断变化,例如像这样,这怎么可能
/example/xyz/log/test.logs?
使用 sed 还是 awk?
答案1
我知道有 3 种方法可以做到这一点。我假设路径作为标准输入传递。
方法一
echo "/sample/xyz/logs/test.logs" | cut -d / -f 3
这将使用 指定的分隔符剪切输入,-d /
并选择第三个字段,即您想要的 xyz 部分。
方法二
echo "/sample/xyz/logs/test.logs" | awk -F / '{print $3}'
awk 是一个非常强大的命令,您可以用它编写非常复杂的逻辑。您可以以这种简单的形式使用它来执行与方法 1 相同的操作。
方法三
echo "/sample/xyz/logs/test.logs" | sed -r 's/^\/\w+\/(\w+)\/.*/\1/g'
与正则表达式一起使用时sed
,您可以省略第一个斜杠、后面的单词以及后面的斜杠。取出第二个斜杠后面的单词,然后删除其余的单词。
正如您所看到的,这些方法的复杂性有所增加。
答案2
如果你的脚本是bash/dash/ksh/zsh,你不需要任何外部工具,参数替换可以给你答案:
path=/sample/xyz/logs/test.logs
path=${path#/*/}
echo ${path%%/*}
#
从左侧移除。%
从右侧移除。- 将字符加倍会使匹配变得贪婪,即尽可能匹配。
答案3
如果你总是想要路径的第二部分,试试这个
echo "/sample/xyz/logs/test.logs" | awk -F/ '{print $3}'