string - 给定一系列位置的 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;
解决方案
假设 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。
推荐阅读
- parsing - 为什么我们在编译器中同时需要预读符号和预读符号
- android - 片段管理器添加错误的片段
- c# - AQMP ReceiverLink 失去连接
- arrays - 无需复制或分配的 Swift 数组类型之间的转换
- r - 是否可以在不分解数据的情况下创建 ggMarginal 图?
- sql-server - 查找过去 1 小时内更新的行数的脚本
- angular - angular cli ng generate 组件忽略了 angular.json 的默认值
- sharepoint - 使用基于 XML 的查询语言进行 SharePoint 列表连接的数据驱动 SSRS 订阅
- python-3.x - 我在 csv 文件中读取了一行,想知道一个单词的项目编号
- excel - 当用户输入是日期时,如何编码“下个月的第一个星期一”?