删除部分绝对路径字符串

时间:2015-05-06 14:26:21

标签: linux perl sed

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

  

\服务器/ GLB /数据/目录/变种/ LOC2 /日志/ 123456.log

我试图简单地从字符串中删除glb / data /给我:

  

\服务器/目录/变种/ LOC2 /日志/ 123456.log

我一直试图用sed和perl无济于事。 这将插入到运行的脚本中以创建链接并将其插入到Oracle表中。

测试文件中还有其他链接,因此我认为cut命令无效。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这里有一些适用于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/,,;

答案 1 :(得分:1)

这似乎很简单:

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)
    );