首页 > 解决方案 > 给定一系列位置的 sed 就地替换

问题描述

我有一个文本文件

Firstline
Sometext1 randomtext1
Sometext2 randomtext2
Sometext3 randomtext3
Sometext4 randomtext4
.
.
.
lastline

预期产出

Firstline
Sometext1 commontext
Sometext2 commontext
Sometext3 commontext
Sometext4 commontext
.
.
.
lastline

不包括第一行和最后一行,对于位置范围(如 location10 到位置 20)的所有行,我在此范围内有要替换的通用文本

如何使用 sed 就地替换来实现这一点?

目前我正在将除第一行和最后一行之外的所有行放入一个文件中,在这个文件上我正在运行 awk gsub(start location, offset) 我将文件名作为参数传递给脚本

cp $1 $1_original
sed '1d;$d' $1 > output_interim.txt;
awk '{gsub (substr($0,10,10),"commontext",$0); print $0 }' output_interim.txt > output.txt;
(head -1 $1_original; cat output.txt; tail -1 $1_original) > $1;

标签: stringsedreplace

解决方案


假设 GNU sed(用于-r选项)

在这里,我用文本“common”替换“location11”到“location17”——保存前 10 个字符并替换接下来的 6 个字符:

sed -r '1n; $n; s/^(.{10}).{6}/\1common/' <<END
Firstline
Sometext1 randomtext1
Sometext2 randomtext2
Sometext3 randomtext3
Sometext4 randomtext4
.
.
.
lastline
END
Firstline
Sometext1 commontext1
Sometext2 commontext2
Sometext3 commontext3
Sometext4 commontext4
.
.
.
lastline

然后,要使用备份副本就地写入,请将-i.bak选项添加到 sed。


推荐阅读