bash:不显示 grep 命令的搜索词中的行部分

bash:不显示 grep 命令的搜索词中的行部分

例如我有一个目录:

/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

相关内容