Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 删除绝对路径字符串的一部分_Linux_Perl_Sed - Fatal编程技术网

Linux 删除绝对路径字符串的一部分

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

在Linux中,我试图删除文本文件中的部分路径。完整路径为:

\server/glb/data/dir/var/loc2/log/123456.log

我试图简单地从字符串中删除glb/data/,以获得:

\server/dir/var/loc2/log/123456.log

我一直试图使用sed和perl,但都没有用。 这将被插入到正在运行的脚本中,以创建链接并将其插入到Oracle表中

测试文件中还有其他链接,所以我认为cut命令不起作用


有什么想法吗?

下面是一些可以与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实际上并不太关心您使用什么,但是当我不想使用
/