2014-10-01 53 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