例如我有一个目录:
/A/B/C/D/E/F/G.txt
由于不知道先验/E/F/G.txt
,我需要隔离该部分。为了便于举例:
echo '/A/B/C/D/E/F/G.txt' | grep -o '/A/B/C/D'
演出:
/A/B/C/D
但我想要:
/E/F/G.txt
和:
echo '/A/B/C/D/E/F/G.txt' | grep -o -v '/A/B/C/D'
我没有得到期望的输出(根本没有输出)。
如何使用获得所需的输出grep
,即不显示搜索条件中的行部分grep
?
答案1
使用 PCRE 表达式,您可以指定一个模式,但使用以下命令将其从匹配中排除\K
:
% echo '/A/B/C/D/E/F/G.txt' | grep -Po '/A/B/C/D\K.*'
/E/F/G.txt
但是,如果这实际上适用于文件和目录,我建议使用find
:
% mkdir -p A/B/C/D/E/F
% touch A/B/C/D/E/F/G.txt
% find A/B/C/D -type f -printf "%P\n"
E/F/G.txt
或者如果你真的想要前导斜杠:
% find A/B/C/D -type f -printf "/%P\n"
/E/F/G.txt
从文档find
:
%P
文件的名称与从头开始删除的命令行参数的名称。
答案2
使用realpath
:
file=/A/B/C/D/E/F/G.txt
realpath --relative-to="/A/B/C/D" "$file"
-m
(如果那不是一个真实文件则需要。)
输出:
E/F/G.txt