用另一个文本文件中的第 i 行替换文本文件的第一行

用另一个文本文件中的第 i 行替换文本文件的第一行

我可以在终端中执行以下操作吗?(以伪代码编写)

for (int i=1;i<=5;i++) {
replace first line of fileout.text by i-th line of filein.txt 
}

我猜想它在某种程度上涉及使用 sed,但我不知道如何从一个文件 sed 到另一个文件。

编辑:我将 Htorque 的答案放在一个循环内:

for (( i = 1 ; i <= 10 ; i++ )); do
    line=$(sed -n "${i}p" filein.txt)
    sed -i "1c\\$line" fileout.txt
done

效果很好。可以用 filein.txt 的实际行数替换计数器中的固定字符串“10”:

nline=$(sed -n '$=' filein.txt)
for (( i = 1 ; i <= $nline ; i++ )); do
    line=$(sed -n "${i}p" filein.txt)
    sed -i "1c\\$line" fileout.txt
done

答案1

要用 FILE.in 的第 i 行替换 FILE.out 的第一行,我可以这样做:

 i=<line-number>
 line=$(sed -n "${i}p" FILE.in)
 sed -i "1c\\$line" FILE.out

如果iFILE.in 中不存在,则 FILE.out 的第一行将被删除(空)。

如果$line包含任何特殊字符(例如反斜杠、美元符),则需要对其进行转义。

不能 100% 确定这不会在其他地方发生。

答案2

该程序分为两个部分:获取所需的输出,然后用该输出替换原始文件的内容:

#!/bin/sh
# output the first five lines of the first argument
# followed by all but the first of the second argument
# if successful, replace the second argument with the
# result

# cribbed almost entirely from Kernighan & Pike's
$ "The Unix Programming Environment" script "overwrite"

case $# in
0|1)        echo 'Usage: replace5 filea fileb' 1>&2; exit 2
esac

filea=$1; fileb=$2
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15    # clean up files

# collect input
if head -5 $filea >$new && tail -n +2 $fileb >> $new
then
    cp $filea $old   # save original file
    trap 'trap "" 1 2 15; cp $filea $old   # ignore signals
          rm -f $new $old; exit 1' 1 2 15   # during restore
    cp $new $filea
else
    echo "replace5: failed, $filea unchanged" 1>&2
    exit 1
fi
rm -f $new $old

相关内容