这基本上可以归结为“如何结合使用 pwd 和 sed delete(或替代方法)”。给定一个包含文件路径列表的文件,如何删除包含当前目录的行?
因此,如果 file1 包含:
/dirA/subdir1/somefile
/dirB/subdir2/somefile
/dirB/subdir2/somefile
/dirC/subdir2/somefile
/dirD/subdir1/somefile
我的工作目录是:
/dirB/subdir2/
然后我的输出应该就地编辑 file1 以得到以下结果:
/dirA/subdir1/somefile
/dirC/subdir2/somefile
/dirD/subdir1/somefile
我知道我可以用以下命令删除行:
sed '/pattern to match/d' file1
我可以像这样将 pwd 输入 sed:
sed 's?#REPLACE-WITH-PATH?'`pwd`'?'
所以我认为我可以将它们组合为以下之一:
sed '/'`pwd`'/d' file1
sed '?'`pwd`'?d' file1
sed '#'`pwd`'#d' file1
第一个选项无法正确读取,因为它将路径的斜杠解释为 sed 命令的一部分。第二个选项无法识别问号。第三个选项可以运行,但不会执行任何操作。
因为您当前目录包含,所以
/
我建议从 切换/.../d
到\|...|d
或\#...#d
。该变量
$PWD
填充了当前工作目录,因此在其后附加一个斜杠并使用awk
。根据您是否要跳过或打印包含当前工作目录子目录的行,使用以下 Perl 单行命令之一,例如
/dirB/subdir2/subdir3/somefile
:跳过
/dirB/subdir2/subdir3/somefile
:打印
/dirB/subdir2/subdir3/somefile
:Perl 单行命令使用这些命令行标志::
-e
告诉 Perl 在行内查找代码,而不是在文件中。-n
:一次循环输入一行,$_
默认将其分配给。-l
:在行内执行代码之前删除输入行分隔符("\n"
默认在 *NIX 上),并在打印时附加它。正则表达式使用这些修饰符::
x
忽略空格和注释,以提高可读性。在正则表达式中:
^
: 匹配行首。\Q$ENV{PWD}\E
: 当前工作目录 ($ENV{PWD}
),禁用模式元字符(引用)。感谢jhnc建议使用\Q
。.+
: 任何重复 1 次或多次的字符。[^/]+
:除斜杠 (/
) 之外的任何字符,重复 1 次或多次。$
: 匹配行尾。参见:
perldoc perlrun
:如何执行 Perl 解释器:命令行开关perldoc perlre
:Perl 正则表达式 (regexes)perldoc perlrequick
:Perl 正则表达式快速入门