的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