linux - sed 用多行文件或变量替换行
问题描述
我正在从文件中检索一个部分,并想用这个多行数据替换另一个文件中的一行。目前我正在输出到一个文件,但更喜欢使用一个变量。
例如
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"
我知道此时我可以删除这条线,但我觉得其他人可能也想知道这一点,我还没有找到一个好的解决方案。
解决方案
在这里找到解决方案
使用 GNU sed:
在文件 file.csv 中查找包含 find 的行,追加文件 newline.txt 的内容 (r) 并删除 (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 中包含特殊字符(\、& 和 /),则会出现问题。没有找到一个好的解决方案,所以我会保留文件的解决方法。
推荐阅读
- opencv - 给定表格结构的坐标,使用 Pytesseract 将文本提取到表格数组中
- c# - 无法使用 RestSharp 反序列化 XML 中的多个列表
- snakemake - 访问 Snakefile 中的命令行 --jobs 参数
- linux - 无法使用 spark-shell 启动 spark
- jmeter - JMeter-使用 ${} 或 vars.get() 获取变量值有什么区别
- python-behave - 如何在 Python 中的场景行为后清理数据库
- c# - 选择自动完成文本时调用函数
- vba - 尝试用条件替换 1 个值会替换整个列
- javascript - 当窗口调整大小时另一个元素的高度发生变化时,如何动态更新元素的 outerHeight?
- vba - 来自单元格的 VBA Web 查询