的solution通過speakr可能是最好的,但我還是老派和類似sed
。
您可以在單個-e
參數中提供多個命令給sed
,該參數以分號分隔或多個-e
參數;我更多地使用後者。我還會清除find
的名稱以刪除主要路徑。然後,您需要決定是否使用擴展的正則表達式,而且您需要使用的是一致的。
使用GNU sed
4.4.2(©2012),我無法獲得\d
表示法來識別數字;這裏可能有些愚蠢的東西。
沒有擴展正則表達式(將與sed
非GNU版本的工作):
for file in $(find /home/user/books -type f -name '*.txt')
do
base=$(basename $file .txt)
name=$( echo "$base" | sed -e 's/^\(.*\).V.*$/\1/' -e 's/\./ /g') # replace dots
volume=$(echo "$base" | sed -e 's/^.*V\([0-9]\{4\}\).*$/\1/')
issue=$(echo "$base" | sed -e 's/^.*\([0-9]\{4\}\)$/\1/')
echo "$name" "$volume" "$issue"
done
輸出的例子書:
to kill a mockingbird 1960 0001
使用GNU sed
的 '擴展正則表達式'模式(-r
):
for file in $(find /home/user/books -type f -name '*.txt')
do
base=$(basename $file .txt)
name=$( echo "$base" | sed -r -e 's/^(.*).V.*$/\1/' -e 's/\./ /g') # replace dots
volume=$(echo "$base" | sed -r -e 's/^.*V([0-9]{4}).*$/\1/')
issue=$(echo "$base" | sed -r -e 's/^.*([0-9]{4})$/\1/')
echo "$name" "$volume" "$issue"
done
使用\d
符號(不正確的輸出):
for file in $(find /home/user/books -type f -name '*.txt')
do
base=$(basename $file .txt)
name=$( echo "$base" | sed -r -e 's/^(.*).V.*$/\1/' -e 's/\./ /g') # replace dots
volume=$(echo "$base" | sed -r -e 's/^.*V(\d{4}).*$/\1/')
issue=$(echo "$base" | sed -r -e 's/^.*(\d{4})$/\1/')
echo "$name" "$volume" "$issue"
done
輸出:
to kill a mockingbird to.kill.a.mockingbird.V1960.0001 to.kill.a.mockingbird.V1960.0001
這也適用 - 謝謝你的幫助!也會爲此投票,但我沒有足夠的聲望! – 2013-03-11 07:23:06