我正在创建一个脚本,将大量文件从一个路径复制到另一个路径。 路径上的任何文件在第一行都有很多“垃圾”,直到“Return-Path .....”这个词。
文件内容示例:
§°ç§°*é*é*§°ç§°çççççççReturn-PathOTHERTHINGS
REST
OF
THE
FILE
EOF
可能sed或awk可以帮助解决这个问题。
问题:
我想要文件的全部内容,除了之前的“返回路径”之外的任何内容,它应该只在第一行被剥离,这样:
Return-PathOTHERTHINGS
REST
OF
THE
FILE
EOF
重要的是:Return-Path之前的任何内容都是“二进制”,infact文件被视为二进制文件... 怎么解决?
答案 0 :(得分:3)
好的,这是新的一天,现在我觉得要为你编写代码: - )
该算法在我对同一问题的另一个答案中有所描述。
#!/bin/bash
################################################################################
# behead.sh
# Mark Setchell
#
# Utility to remove stuff preceding specified string near start of binary file
#
# Usage: behead.sh <infile> <outfile>
################################################################################
IN=$1
OUT=$2
SEARCH="Return-Path"
for i in {0..80}; do
str=$(dd if="$1" bs=1 count=${#SEARCH} iseek=$i 2> /dev/null)
if [ "$str" == $SEARCH ]; then
# The following line will go faster if you exchange "bs" and "iseek"
# parameters, because it will work in bigger blocks, it just looks
# wrong, so I haven't done it.
dd if="$1" of="$OUT" bs=1 iseek=$i 2> /dev/null
exit $?
fi
done
echo String not found, sorry.
exit 1
你可以测试它是这样的:
#
# Create binary with 15 bytes of bash, then "Return-Path", then entire bash in file "bashed"
(dd if=/bin/bash bs=1 count=15 2>/dev/null; echo -n 'Return-Path'; cat /bin/bash) > bashed
#
# Chop off junk at start of "bashed" and save in "restored"
./behead.sh bashed restored
#
# Check the restored "bash" is exactly 11 bytes longer than original,
# as it has "Return-Path" at the beginning
ls -l bashed restored
如果您将我的脚本保存为“behead.sh”,则需要将其设置为可执行文件:
chmod +x behead.sh
然后你可以像这样运行它:
./behead.sh inputfile outputfile
顺便说一句,二进制文件中没有“一行”的概念,所以我假设前80个字符 - 你当然可以自由改变它!
答案 1 :(得分:2)
尝试:
sed '1s/.*Return-Path/Return-Path/'
此命令仅在第一行上使用“Return-Path”替换“Return-Path”之前的任何内容。
答案 2 :(得分:2)
我不想在这一刻编码,但可以给你一个提示。 “Return-Path”是11个字符。您可以使用
从偏移“n”的文件中获取11个字符dd if=file bs=1 count=11 iseek=n
因此,如果您执行一个循环,其中“n”从零开始并且增加直到结果与“Return-Path”匹配,您可以计算需要从前面删除的字节数。然后你可以用另一个“dd”做到这一点。
或者,看一下通过“xxd”运行文件,用“sed”编辑它,然后用“xxd -r”以另一种方式通过“xxd”运行它。