如何在bash中使用sed替换

时间:2013-05-24 21:23:46

标签: bash

我正在尝试在"_"之前获取唯一的文件名,并仅复制这些文件。下面是脚本,但我必须遗漏一些关于sed

的内容

我的文件名示例 - P2.D2.C00_21,P2.D2.C00_22

#!/bin/bash   

echo "Step 1"
names=$(ls ./Folder1 | sed 's//.*_//' | uniq)

echo "Step 2"    
for name in `echo $names`
do
    echo "Step 3"
    files=($(ls -v ./Folder1/${name}.* | xargs -n1 basename))
    echo "step 4"
    cp -f ./Folder1/${files[${#files[@]} - 1]} ./folder2
    echo "step 5"
done

2 个答案:

答案 0 :(得分:1)

你采取了错误的方式:

  • 不要使用for循环来迭代文件以防止word spliting的错误。相反,请使用find或while循环
  • 不要在脚本中解析ls输出,而是使用 globs

答案 1 :(得分:1)

这个找到_之后的部分:

 sed 's//.*_// # should be 's/_.*//'

但是因为你在uniq之后是全球化的,所以我根本看不到sed的好处。另外,使用ls是一种非常糟糕的做法,你应该依赖于通配。

如果您不介意使用Perl:

for (glob("Folder1/*")) {
    ($a,$b,$c)=/((.*)_(.*))/;
    push @{$h{$b}}, $c; 
}
for $b(keys %h) {
    system("cp '${b}_$h{$b}[-1]' folder2/");
}