我将sed
分两步使用:
sed
从不需要的信息创建脚本。
- 将创建的脚本应用到数据文件。
那可能是:
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed 's%.*%/,&,/d%' $unwanted > sed.script
sed -f sed.script $datafile > $cleaned
rm -f sed.script
第一次调用sed
只需将描述不需要的记录的每一行的内容替换为一个sed
命令,该命令将删除它作为数据行中间的逗号分隔字段。如果您还必须在开头或结尾处理不需要的字段,那么您必须更加努力。如果可能嵌入斜杠、逗号、引号等,您还必须更加努力。第二次调用sed
将第一次创建的脚本应用于数据文件,生成清理后的文件。
您可以通过确保脚本文件名是唯一的,并在进程中断时捕获脚本文件来改进它:
tmp=$(mktemp /tmp/script.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # EXIT, HUP, INT, QUIT, PIPE, TERM
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed 's%.*%/,&,/d%' $unwanted > $tmp
sed -f $tmp $datafile > $cleaned
rm -f $tmp
trap 0 # Cancel the exit trap
使用 GNU sed
,但不使用 Mac OS X (BSD) sed
,您可以避免中间文件:
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed 's%.*%/,&,/d%' $unwanted |
sed -f - $datafile > $cleaned
这告诉第二个sed
从标准输入读取它的脚本。如果您有bash
版本 4.x(在 Mac OS X 上不是标准版本),则可以使用进程替换:
unwanted=/home/bankey/shopimport/unwanted.txt
datafile=/home/arno/pixtmp/pixtmp.csv
cleaned=/home/arno/pixtmp/pix-clean.csv
sed -f <(sed 's%.*%/,&,/d%' $unwanted) $datafile > $cleaned