2014-10-01 2 views
0

Использование bash ...Извлечь линии между двумя узорами

Я хочу перебирать список переменных для каждого события '_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

я могу 't получить строки для отображения после строки, заканчивающейся '_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

+0

@voiczed Это невозможно: у вас есть состояние, которое распространяется от одной строки до следующей –

Смежные вопросы