Как добавить содержимое файла в другой файл раньше} - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть 2 файла. Файл 1: источник. sh Файл 2: место назначения. sh

Я хочу вставить содержимое файла 1 в файл 2. Но я не хочу вставлять содержимое в конце файл. Последняя строка файла 2: "}"

Я хочу вставить содержимое файла 1 в файл 2 перед "}"

Ниже приведен мой код:

filename50 - /path/of/the/file #source
my_file4 - /path/of/the/file   #destination
cat "$my_file4" >> "$filename50"

Приведенный выше код вставляет код в конец файла ... Может кто-нибудь помочь мне вставить содержимое в целевой файл до } Любая помощь приветствуется.

Пример кода:

Источник. sh

a
b
c

Пункт назначения . sh

{
w
e
r
t
y
}

Ожидаемый вывод:

{
w
e
r
t
y
a
b
c
}

Содержимое в источнике. sh должно быть вставлено в место назначения. sh перед}

Мой точный код: Soure. sh

xxx_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.xxx_ecmwf_main_state_machine.id}"

xxx_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.xxx_ecmwf_etl_state_machine.id}"

xxx_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_xxx_ecmwf_scoring_state_machine_lambda.function_name}"

Пункт назначения. sh

{
    zzz_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.zzz_ecmwf_main_state_machine.id}"

    zzz_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.zzz_ecmwf_etl_state_machine.id}"

    zzz_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_zzz_ecmwf_scoring_state_machine_lambda.function_name}"

    ccc_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.ccc_ecmwf_main_state_machine.id}"

    ccc_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.ccc_ecmwf_etl_state_machine.id}"


    ccc_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_ccc_ecmwf_scoring_state_machine_lambda.function_name}"

    rrr-ltf_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.rrr-ltf_ecmwf_main_state_machine.id}"

    rrr-ltf_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.rrr-ltf_ecmwf_etl_state_machine.id}"

    rrr-ltf_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_rrr-ltf_ecmwf_scoring_state_machine_lambda.function_name}"

    rrr_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.rrr_ecmwf_main_state_machine.id}"

    rrr_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.rrr_ecmwf_etl_state_machine.id}"

    rrr_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_rrr_ecmwf_scoring_state_machine_lambda.function_name}"
    }

Мне нужно вставить источник. sh в место назначения. sh перед "}"

Я использовал

    { head -n -1 "$filenamelocalsource"; cat "$my_destination"; tail -n 1 "$filenamelocalsource"; } > tmp
mv tmp "$filenamelocaldestination"

Мой вывод:

ttt_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.ttt_ecmwf_main_state_machine.id}"   
ttt_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.ttt_ecmwf_etl_state_machine.id}"
continuum2_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_ttt_ecmwf_scoring_state_machine_lambda.function_name}"  
**}**   
mmm_ecmwf_scoring_state_machine_arn = "${aws_sfn_state_machine.mmm_ecmwf_main_state_machine.id}"

mmm_ecmwf_etl_state_machine_arn = "${aws_sfn_state_machine.mmm_ecmwf_etl_state_machine.id}"

mmm_ecmwf_scoring_function_name = "${aws_lambda_function.invoke_mmm_ecmwf_scoring_state_machine_lambda.function_name}"

Я выполнил команду { echo "---------"; nl "$filenamelocal" | tail -2; echo "---------"; }

enter image description here

Ответы [ 4 ]

1 голос
/ 01 апреля 2020

Это может работать для вас (GNU sed):

sed '$e cat file1' file2

Вставить файл1 перед последней строкой файла2.

0 голосов
/ 01 апреля 2020

Если вы хотите сохранить изменения в destination.sh:

printf "%s\n" '$-1r source.sh' w | ed -s destination.sh

Этот r преобразует содержимое source.sh в destination.sh перед последней строкой файла и w возвращает его обратно.

0 голосов
/ 01 апреля 2020

Использование ed(1) и printf

printf '%s\n' '$-1r source.sh' ,p Q | ed -s destination.sh

Это просто покажет вам результат. Для редактирования файла на месте используйте это.

printf '%s\n' '$-1r source.sh' w | ed -s destination.sh
0 голосов
/ 01 апреля 2020

Если файлы соответствуют описанным вами, вы можете разделить файл, чтобы создать новый файл на три части: начало файла 2, файл 2, конец файла 1:

head -n -1 destination.sh > tmp
cat source.sh >> tmp
tail -n 1 destination.sh >> tmp
rm destination.sh
mv tmp destination.sh

tail -n 1 destination.sh >> tmp может быть заменено на echo "}" >> tmp, если оно содержит то, что вы сказали.

Весь этот код можно собрать вместе, чтобы избежать многократного открытия файла для записи. Кроме того, mv может перезаписать существующий файл, поэтому мы можем избежать rm:

{ head -n -1 destination.sh; cat source.sh; tail -n 1 destination.sh; } > tmp
mv tmp destination.sh
...