sed用多行文件或变量替换行

时间:2018-10-19 16:38:02

标签: linux bash sed text-processing

我正在从文件中检索节,并希望用此多行数据替换另一个文件中的行。目前,我正在输出到文件,但希望使用变量。

例如

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 :(得分:1)

找到的解决方案here

  

使用GNU sed:

     

文件file.csv中的查找行,其中包含以下内容的查找,附加内容(r):   文件newline.txt并删除(d)包含查找的行

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

从变量而不是文件中获取:

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

请注意,我们使用双引号而不是单引号。 但是,如here所示,如果您在$ OUTPUT内有特殊字符(\,&和/ /),则会出现问题。找不到合适的解决方案,因此我将保留该文件的解决方法。