delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

06 May 2013

paste(1)

这是一个处理文本的命令,之前一直没怎么用过,最近看 freebsd-update 的时候才知道有这么个玩意。

假设用 piconv 转换了一批 .txt 文件,并将其命名为对应的 .txt.new:


ls *.srt | \
awk -F \\r '{ 
print "piconv -f gbk -t utf8 \"" $1 "\" > \"" $1 ".new\""
}'  | sh -x

(这个是个简单的例子,只考虑有空格,而没有考虑文件名中有换行、引号等情况;换行是为了排版方便)。

然后,想要把所有的 .txt.new 改名为 .txt,此时便可以用 paste。

首先生成两个列表,old.list 和 new.list,分别包括转换前后的文件名:


find . -name '*.txt' | sed -e s/^/\"/g -e s/\$/\"/g | sort > old.list
find . -name '*.txt.new' | sed -e s/^/\"/g -e s/\$/\"/g | sort > new.list

然后用paste:


paste new.list old.list | sed -e s/^/mv\ /g | sh -x

~~是的,你应该发现,用和第一步类似的方法也可以让 awk 干一样的事情。~~这里只是展示一下 paste(1) 的基本用法。