sed заменяет строку многострочным файлом или переменной - PullRequest
0 голосов
/ 19 октября 2018

Я извлекаю раздел из файла и хочу заменить строку в другом файле этими многострочными данными.В настоящее время я выводлю в файл, но предпочитаю использовать переменную.

Например,

R 0x00007d04 0x70040000

[OVERWRITE_1]

C "- Starting Execution"

Становится:

R 0x00007d04 0x70040000

W 0x00001118 0x0d1f4e3a
W 0x0000111c 0xa3795ac8 
W 0x00001120 0xc50e69d5

C "- Starting Execution"

Вот что у меня есть:

START="R 0x00007fd0 0x00000000            # CSR:014 (CSRCID-OPT2)"
END="W 0x00007f80"
FILE=file.txt

#Retrieve text between sections above to variable
OUTPUT=$(sed -n "/^$START$/,/$END/ { /^$START$/d ; /$END/d ; /^$/d ; p }" 
$FILE)

echo "$OUTPUT" > tmp.txt

#This line currently appends after [OVERWRITE_1]
sed '/\[OVERWRITE_1\]/r tmp.txt' test.asm

Что выводит это:

R 0x00007d04 0x70040000

[OVERWRITE_1]
W 0x00001118 0x0d1f4e3a
W 0x0000111c 0xa3795ac8 
W 0x00001120 0xc50e69d5

C "- Starting Execution"

Я знаю, что в этот момент я могу удалить строку, но я чувствую, что другие могут захотеть узнать это также, и я не нашелхорошее решение.

1 Ответ

0 голосов
/ 19 октября 2018

Найденное решение здесь

С GNU sed:

Найти строку в файле file.csv, которая содержит поиск, добавление содержимого (r) файла newline.txt и delete (d) строка, содержащая find

START="R 0x00007fd0 0x00000000            # CSR:014 (CSRCID-OPT2)"
END="W 0x00007f80"
FILE=file.txt

#Retrieve text between sections above to variable
OUTPUT=$(sed -n "/^$START$/,/$END/ { /^$START$/d ; /$END/d ; /^$/d ; p }" 
$FILE)

echo "$OUTPUT" > tmp.txt

sed -e '/\[OVERWRITE_1\]/{r tmp.txt' -e 'd}' test.asm

Sed из переменной вместо файла:

START="R 0x00007fd0 0x00000000            # CSR:014 (CSRCID-OPT2)"
END="W 0x00007f80"
FILE=file.txt

#Retrieve text between sections above to variable
OUTPUT=$(sed -n "/^$START$/,/$END/ { /^$START$/d ; /$END/d ; /^$/d ; p }" 
$FILE)

echo "$OUTPUT" > tmp.txt

sed  "s/\[OVERWRITE_1\]/$OUTPUT/" test.asm

Обратите внимание, что мы использовали двойные кавычки вместо синглов.Но, как выяснилось здесь , возникает проблема, если у вас есть специальные символы внутри $ OUTPUT (\, & и /).Не нашел хорошего решения для этого, поэтому я бы оставил обходной путь с файлом.

...