Linux 删除绝对路径字符串的一部分
在Linux中,我试图删除文本文件中的部分路径。完整路径为: \server/glb/data/dir/var/loc2/log/123456.log 我试图简单地从字符串中删除glb/data/,以获得: \server/dir/var/loc2/log/123456.log 我一直试图使用sed和perl,但都没有用。 这将被插入到正在运行的脚本中,以创建链接并将其插入到Oracle表中 测试文件中还有其他链接,所以我认为cut命令不起作用Linux 删除绝对路径字符串的一部分,linux,perl,sed,Linux,Perl,Sed,在Linux中,我试图删除文本文件中的部分路径。完整路径为: \server/glb/data/dir/var/loc2/log/123456.log 我试图简单地从字符串中删除glb/data/,以获得: \server/dir/var/loc2/log/123456.log 我一直试图使用sed和perl,但都没有用。 这将被插入到正在运行的脚本中,以创建链接并将其插入到Oracle表中 测试文件中还有其他链接,所以我认为cut命令不起作用 有什么想法吗?下面是一些可以与sed一起使用的ba
有什么想法吗?下面是一些可以与sed一起使用的bash:
file_name='\server/glb/data/dir/var/loc2/log/123456.log'
echo $file_name | sed -e 's,glb/data/,,'
这将打印剥离路径,以将其保存在var中
new_name=$(echo $file_name | sed -e 's,glb/data/,,')
类似地,在perl中也可以这样做
my $file_name='\server/glb/data/dir/var/loc2/log/123456.log';
$file_name =~ s,glb/data/,,;
这似乎很简单:
use strict;
use warnings;
use feature qw(say);
my $path = '\server/glb/data/dir/var/loc2/log/123456.log'
say $path =~ s|/glb/data||gr;
# \server/dir/var/loc2/log/123456.log
根据您的平台,上述操作可能会出现故障。以下是执行此操作的更安全方法:
use strict;
use warnings;
use English qw(-no_match_vars);
use feature qw(say);
use File::Basename;
sub remove_dirs_from_path {
my ( $path, @to_remove ) = @_;
my $path_separator = $OSNAME =~ m/MSWin32/ ? '\\' : '/';
my ($filename, $directory, undef) = fileparse($path);
my @dirs_to_keep;
foreach my $dir ( split $path_separator, $directory ) {
next if grep { $dir eq $_ } @to_remove;
push @dirs_to_keep, $dir;
}
return join($path_separator, @dirs_to_keep, $filename);
}
say remove_dirs_from_path(
'\server/glb/data/dir/var/loc2/log/123456.log',
qw(glb data)
);
你能给我们看一下失败的sed或perl代码吗?sed命令很有效,很好。非常感谢。命令末尾逗号的意义是什么?Sed使用分隔符将其命令段拆分为段,在本例中,
glb/data/
是要匹配的模式,空字符串是要替换匹配模式的模式。通常使用/
作为分隔符,但由于/
出现在我们试图匹配的模式中,因此我使用了,
。sed实际上并不太关心您使用什么,但是当我不想使用/