给定 /abc/xyz 使用 sed 返回 /abc/xyz、/abc 和 /xyz

给定 /abc/xyz 使用 sed 返回 /abc/xyz、/abc 和 /xyz

这可能吗?我有一个包含大量 URL 和相对路径的 HTML 文件。我想把它们全部收集起来。我知道 HTML 无法用正则表达式正确解析,但我正在寻找一种不关心它正在查看的数据类型的解决方案。它应该只提取每个/[A-Za-z0-9_-]*包含多个目录深度的路径。

鉴于 /this/is/a/test 我应该得到:

/this
/is
/a
/test
/this/is
/this/is/a
/this/is/a/test
/is/a
/a/test
/is/a/test

我想这就是全部。如果我能为此编写一个解决方案,我确信!

答案1

$ sed -n -f script.sed file
/this/is/a/test
/this/is/a
/this/is
/this
/is/a/test
/is/a
/is
/a/test
/a
/test

哪里script.sed

:outer
h
:inner
/./ {
    p
    s:/[^/]\{1,\}$::
    t inner
}
g
s:^/[^/]\{1,\}::
t outer

其中file包含您提到的示例路径名的文件。

该脚本实现了一个处理每一行输入的双循环。它期望获得带有路径名的行仅有的

外循环(标记为outer)将当前行复制到保留空间 ( h)。如果该行为空,则完全跳过内部循环(标记为inner),如果该行不为空,则打印当前行。然后从当前行中删除最后一个/<anything>,并且如果该替换修改了数据,则t inner循环回到内循环的开头。

否则,将从保留空间 ( ) 中取出已保存的行,并从中删除g第一行。/<anything>如果该替换修改了数据,则代码将循环回到外循环的开头。

最终结果是,您将打印出完整的路径名,然后您将获得通过从末尾删除连续路径组件而生成的每个路径名。

然后,对通过从原始路径名中删除第一个路径元素而获得的路径名重复相同的操作。 ETC。

如果交换代码中的两个替换,您会得到相同的结果,但顺序不同:

/this/is/a/test
/is/a/test
/a/test
/test
/this/is/a
/is/a
/a
/this/is
/is
/this

答案2

问题的主体似乎问了两个不同的事情。这解决了第一个问题,即从输入文件中提取任何看起来像符合所述正则表达式的相对 URL 路径的内容。

使用grep

grep -Eio "(/[a-z0-9_-]+)+" file.html

相关内容