我有一个输入文件,如下所示:
1
30
35
90 ...
我想做的是修改它,以便它向我显示以下内容:
sed -i '1s///g' file_to_modify
sed -i '30s///g' file_to_modify
你知道我如何在 Linux 中做到这一点吗?
答案1
假设您有一个包含行号的文件,lines.list
并且您想要创建一个在列出的每一行上sed
执行的编辑脚本:s///g
sed 's:$:s///g:' lines.list
给定一个包含问题中显示的四个数字的文件,这将生成sed
脚本
1s///g
30s///g
35s///g
90s///g
s///g
它通过添加到每行的末尾来实现这一点。为了避免转义斜杠,s
脚本中的命令使用:
作为替代分隔符。
运行这个脚本需要使用sed -f
:
sed 's:$:s///g:' lines.list | sed -i -f /dev/stdin file_to_modify
这将创建sed
如前所示的脚本,然后将其应用到某个名为file_to_modify
.由于我使用的是-i
,这也会在文件中进行就地编辑,假设我们使用的是sed
知道此选项的文件(例如 GNU sed
)。
但请注意,编辑脚本本身没有什么意义。带有替换命令的空正则表达式将重新使用最近匹配的正则表达式。由于脚本中没有这样的表达式,因此第一个s
命令将触发sed
.
答案2
我会做什么
sed -E "s:[0-9]+:sed -i '&s///g' file_to_modify:" file
输出
sed -i '1s///g' file_to_modify
sed -i '30s///g' file_to_modify
sed -i '35s///g' file_to_modify
sed -i '90s///g' file_to_modif
或组合为单个调用
sed -E 's:[0-9]+:&s///g:' file |
paste -sd ';' |
sed "s:.*:sed -i '&' file_to_modify:"
sed -i '1s///g;30s///g;35s///g;90s///g' file_to_modify