2014-10-01 56 views
0

使用bash ...2个模式之间的提取线

我希望遍历每个'_Brkt'发生的变量列表;

echo "$BrackListAllFinal" 

DSCF3649-DSCF3651_Brkt 
DSCF3649.JPG 2014-07-21 13:34:44 On 1 
DSCF3649.RAF 2014-07-21 13:34:44 On 1 
DSCF3650.JPG 2014-07-21 13:34:45 On 2 
DSCF3650.RAF 2014-07-21 13:34:45 On 2 
DSCF3651.JPG 2014-07-21 13:34:45 On 3 
DSCF3651.RAF 2014-07-21 13:34:45 On 3 
DSCF3652-DSCF3654_Brkt 
DSCF3652.JPG 2014-07-21 13:38:24 On 1 
DSCF3652.RAF 2014-07-21 13:38:24 On 1 
DSCF3653.JPG 2014-07-21 13:38:24 On 2 
DSCF3653.RAF 2014-07-21 13:38:24 On 2 
DSCF3654.JPG 2014-07-21 13:38:25 On 3 
DSCF3654.RAF 2014-07-21 13:38:25 On 3 

我想显示的文件名在“_Brkt”结尾的行每一次出现的以下并在下一次出现停止 ,如果存在。我将以'_Brkt'结尾的每一行创建一个新目录,并将它后面的顺序文件移动到新目录中。

我试过了;

echo "$BrackListAllFinal" | awk '{print $1}' | awk '/.*\..*/, /_Brkt$/' 

......还有......

echo "$BrackListAllFinal" | awk '{print $1}' | sed -n '/_Brkt$/,/_Brkt$/p 

例如...

  1. 创建在 '_Brkt'

    DSCF3649结束每行一个新的目录-DSCF3651_Brkt

  2. 将顺序文件名移动到新目录中。

    • DSCF3649.JPG
    • DSCF3649.RAF
    • DSCF3650.JPG
    • DSCF3650.RAF
    • DSCF3651.JPG
    • DSCF3651.RAF

我可以在行结束后不会显示行'_Brkt'。 我有点失落,有人可以帮忙。

谢谢。

回答

0

Perl来救援:

echo "$BrackListAllFinal" \ 
    | perl -MFile::Copy=mv -lne 'if (/_Brkt/) { mkdir $d = $_ } else { s/ .*//; mv $_, $d }' 
1

让我们从一开始就建立此设置:

首先,你要迭代一个变量的线,这需要作为同时具有重定向

while read LINE; do 
    # ... 
done < <(echo -e "$BrackListAllFinal") 

现在要提取线条来作为一个目录:一个简单的组变化

THEDIR='.' 
while read LINE; do 
    SEDED=$(echo "$LINE" | sed 's/_Brkt$//') 
    if test "$SEDED" == "$LINE"; then 
    # File line 
    else 
    # Directory line 
    fi 
done < <(echo -e "$BrackListAllFinal") 

最后,你想在你的有效载荷,以填补

THEDIR='' 
while read LINE; do 
    SEDED=$(echo "$LINE" | sed 's/_Brkt$//') 
    if test "$SEDED" == "$LINE"; then 
    # File line: Move the file 
    echo -n "Moving file '$LINE' .." 
    if test -z "$THEDIR"; then 
     echo ".. Error: Directory not yet set" 
     exit 1 
    fi 
    mv "$LINE" "$THEDIR" >/dev/null 2>&1 
    if test "$?" == "0"; then 
     echo ".. OK" 
    else 
     echo ".. Error: Move failed" 
     exit 2 
    fi 
    else 
    # Directory line: Remember and create directory 
    echo -n "Creating directory '$LINE' .." 
    THEDIR="$LINE"; 
    mkdir -p "$THEDIR" >/dev/null 2>&1 
    if test "$?" == "0"; then 
     echo ".. OK" 
    else 
     echo ".. Error" 
     exit 3 
    fi 
    fi 
done < <(echo -e "$BrackListAllFinal") 
+0

很多感谢您的回答。我很难将这一点融入到迄今为止我所做的事情中。您能否告诉我如何使用sed或awk来执行选择。谢谢。 – voiczed 2014-10-02 01:47:40

+0

@voiczed这是不可能的:你有状态从一行传播到下一行 – 2014-10-02 10:08:53