Bash 提取两个图案之间的线条
使用bash 我希望为每一个'u Brkt'的出现迭代一个变量列表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
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
例如
- DSCF3649.JPG
- DSCF3649.RAF
- DSCF3650.JPG
- DSCF3650.RAF
- DSCF3651.JPG
- DSCF3651.RAF
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")