提取2种模式之间的线条

时间:2014-10-01 12:23:46

标签: bash loops design-patterns extract

使用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
  3. 我无法在以' _Brkt'结尾的行后显示行。 我有点迷失在这个上,有人可以帮忙。

    谢谢。

2 个答案:

答案 0 :(得分:1)

让我们从头开始构建它:

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

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")

答案 1 :(得分:0)

Perl救援:

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