使用sed获取到某一点的不同路径的列表

使用sed获取到某一点的不同路径的列表,sed,Sed,我有一个如下所示的文件路径列表 abc/def/ghi/jl/r1/r2 abc/def/ghi/jl/r9/r11 abc/nyc/ghi/jl/r3/r4/r5 abc/nyc/ghi/jl/pan21/nab11 def/kyn/ghi/jl/r6 ... 所有路径都有子路径/ghi/jl/ 我想得到一个以/ghi/jl/结尾的不同路径的列表,因此对于上面的示例,我将得到 abc/def/ghi/jl/ abc/nyc/ghi/jl/ def/kyn/ghi/jl/ 这可以通过sed(

我有一个如下所示的文件路径列表

abc/def/ghi/jl/r1/r2
abc/def/ghi/jl/r9/r11
abc/nyc/ghi/jl/r3/r4/r5
abc/nyc/ghi/jl/pan21/nab11
def/kyn/ghi/jl/r6
...
所有路径都有子路径
/ghi/jl/

我想得到一个以
/ghi/jl/
结尾的不同路径的列表,因此对于上面的示例,我将得到

abc/def/ghi/jl/
abc/nyc/ghi/jl/
def/kyn/ghi/jl/
这可以通过sed(或类似的东西)实现吗?我试过了

但是我没有完全理解它。

perl-ne'/(^.*?\/ghi\/jl)/;打印“$1\n”列表文件|排序-u

使用awk应该可以做到这一点。

awk-F/'{print$1”/“$2”/“$3”/“$4”/”}/path/to/your/file
-F/
告诉awk使用
/
作为分隔输入的分隔符

使用
cut
sed
{cut-d'/'-f-4 | sed's/$/\/'}
这里,
cut
命令分割输入文件中的每一行,然后输出前4个字段(
-f-4
告诉
cut
输出前4个字段)。然后,
sed
命令将
/
追加到
cut
输出的每行末尾

如果不需要每个输出行上的尾随
/
,这将简化为

cut-d'/'-f-4/path/to/your/file

像这样使用
grep

grep -o '.*ghi/jl/' in_file

这里,使用选项
-o
:仅打印匹配项(每行1个匹配项),而不是整行。

使用
sed
排序

sed -ne 's|^\(.*/ghi/jl/\).*|\1|p' -- data | sort -u
或者

其中,替换捕获从行的开始到并包括dirname

或者,选择至少有4个斜杠的目录名

sed -n -e 's|/|\t|4' -e 's|\t.*|/|p' -- data | sort -u
第一个替换将第四个斜杠替换为制表符,第二个替换将制表符和以下字符替换为带斜杠。

这可能适用于您(GNU-sed):

将匹配项存储在保留空间中,确保删除所有重复项。在文件末尾,切换到保留空间并打印结果(减去缓冲区开头引入的换行符)

somedir='/ghi/jl/'
sed -ne 's|^\(.*'"${somedir}"'\).*|\1|p' -- data | sort -u
sed -n -e 's|/|\t|4' -e 's|\t.*|/|p' -- data | sort -u
sed -E '\#(.*/ghi/jl/).*#{s//\1/;H;g;s/((\n.*).*)\2$/\1/;h};$!d;x;s/.//' file