Bash 提取两个图案之间的线条

Bash 提取两个图案之间的线条,bash,loops,design-patterns,extract,Bash,Loops,Design Patterns,Extract,使用bash 我希望为每一个'u 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-2

使用bash

我希望为每一个'u 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
我试图在每次出现以“\u Brkt”结尾的行并停止之后显示文件名 在下一次发生时(如果存在)。我将从以“Brkt”结尾的每一行创建一个新目录,并将其后的顺序文件移动到新目录中

我试过了

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

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

  • 为以“\u Brkt”结尾的每一行创建一个新目录

    DSCF3649-DSCF3651_Brkt

  • 将顺序文件名移动到新目录中

    • DSCF3649.JPG
    • DSCF3649.RAF
    • DSCF3650.JPG
    • DSCF3650.RAF
    • DSCF3651.JPG
    • DSCF3651.RAF
  • 我无法在以“\u Brkt”结尾的行后面显示行。 我有点迷路了,有人能帮我一下吗

    谢谢。

    Perl向救援人员致意:

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

    让我们从一开始就把它建立起来:

    首先,您希望在变量行上迭代,这需要带重定向的while循环

    while read LINE; do
      # ...
    done < <(echo -e "$BrackListAllFinal")
    
    读行时
    ;做
    # ...
    完成<&1
    如果测试“$?”=“0”;然后
    回音“好的”
    其他的
    回显“。错误:移动失败”
    出口2
    fi
    其他的
    #目录行:记住并创建目录
    echo-n“正在创建目录“$LINE”…”
    THEDIR=“$LINE”;
    mkdir-p“$THEDIR”>/dev/null 2>&1
    如果测试“$?”=“0”;然后
    回音“好的”
    其他的
    回显“.错误”
    出口3
    fi
    fi
    
    谢谢你的回答。到目前为止,我很难将这一点融入到我所做的工作中。请告诉我如何使用sed或awk仅执行选择。谢谢。@voiczed这是不可能的:您的状态从一行传播到下一行
    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")