如何在Bash中提取文件行、替换子串并追加至原文件?
Bash实现提取替换并追加行的方案
假设目标文件名为test.txt,可以通过以下几种方式实现需求:
方法1:grep + sed组合命令
这是最直观的方式,分两步完成筛选和替换,再追加到原文件:
grep 'EF' test.txt | sed 's/EF/XY/g' >> test.txt
grep 'EF' test.txt:筛选出文件中所有包含子串EF的行sed 's/EF/XY/g':将筛选出的行里所有EF替换为XY(g表示全局替换,一行中多个EF都会被替换)>> test.txt:把处理后的结果追加到原文件的末尾
方法2:awk单命令处理(更高效)
如果文件较大,awk方法只需要读取一次文件,性能更优:
awk '/EF/{ print modified = $0 gsub(/EF/, "XY", modified) print modified >> FILENAME next }1' test.txt
命令解释:
/EF/{...}:匹配到包含EF的行时执行大括号内的逻辑print:先打印原行,保证原文件内容不变modified = $0:复制当前行到变量modifiedgsub(/EF/, "XY", modified):全局替换modified里的EF为XYprint modified >> FILENAME:将修改后的行追加到当前处理的文件(FILENAME即为输入的test.txt)next:跳过后续逻辑,直接处理下一行1:对不匹配EF的行,默认执行打印操作,保持原内容
注意事项
- 操作前建议备份原文件,比如执行
cp test.txt test.txt.bak,避免误操作导致数据丢失 - 如果需要区分大小写,可以在grep或awk中添加大小写不敏感的参数,比如
grep -i 'EF'或者awk的/EF/i
内容的提问来源于stack exchange,提问作者aroma
相关产品推荐
相关产品推荐

