Замените первую строку в текстовом файле i-th строкой от другого текстового файла

Я могу сделать следующее в терминале? (записанный в псевдокоде)

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

который работает как очарование. Возможно заменить фиксированную строку '10' в счетчике фактическим количеством строк filein.txt:

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
4
задан 3 November 2010 в 20:09

2 ответа

Для замены первой строки FILE.out с i-th строкой FILE.in, я сделал бы:

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

Если i не существует в FILE.in, затем первая строка FILE.out была бы удалена (пустая).

Если $line содержит любые специальные символы (например, обратная косая черта, доллар), затем необходимо было бы выйти из них.

Не 100%, уверенных, это не могло повредиться в другом месте.

3
ответ дан 1 December 2019 в 09:58

Существует две части к программе: получение вывода Вы хотите и затем замена содержания исходного файла с тем выводом:

#!/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
1
ответ дан 1 December 2019 в 09:58

Другие вопросы по тегам:

Похожие вопросы: