使用 wc -l 和 sed 从假脱机文件中删除最后三行

Remove three last lines from spool file using wc -l and sed

我遇到一个问题,我的文件每次都有不同的行数,它以显示导出到文件的行数的 sqlldr 输出结尾


40968 rows selected.

因为这个文件将被下一个进程拾取,所以我想去掉这个额外的文本。 所以我想出了这样的想法:

# Remove exported record count from end of file
remove_count=$(( $(wc -l < ${output_dir}/file.dat)-3+1 ))
echo "Removing extra lines from spooled file"
sed '$remove_count, $ d' file.dat >> file.dat

问题是 sed 似乎不能使用变量作为行数,之后它应该开始删除。我找不到更好的解决方案。 有什么我可以做得更好或有人看到错误吗? 提前致谢!

sed 可以包含变量扩展。

这是正确 bash 引用的问题。

' 防止字符串中的任何 bash 扩展。

" 允许字符串中的所有 bash 扩展。

建议尝试:

# Remove exported record count from end of file
remove_count=$(( $(wc -l < ${output_dir}/file.dat)-3+1 ))
echo "Removing extra lines from spooled file"
sed -i "$remove_count, $ d" file.dat 

你不需要这么复杂的解决方案; head 可以这样做:

$ echo -e 'first\nsecond\nthird\nfourth' | head -n-3
first

查看手册:

       -n, --lines=[-]NUM
              print the first NUM lines instead of  the  first  10;  with  the
              leading '-', print all but the last NUM lines of each file

这可能适合您 (GNU sed):

sed '1N;N;$d;P;D' file

这将删除文件的最后 3 行。

程序化版本为:

sed ':a;N;s/[^\n]*/&/3;Ta;d$;P;D' file

其中 3 可以是从文件末尾算起的任意行数。