首页 > 解决方案 > 如果第一行与模式匹配,则 Sed 在文件的第一行插入字符串

问题描述

我有一个sed问题在任何地方都找不到答案:

我有一堆文件,其中一些以字符串开头,###有些则没有。在每个以我开头的文件中,###我想在当前第一行之前插入一些多行字符串。

fe 如果文件看起来像

### the first line

abc cba jfkdslfjslkd

我希望在顶部插入多行字符串

my
multi
line
string

### the first line

abc cba jfkdslfjslkd

文件中的任何其他内容都不应被修改。

如果一个文件没有开始,###那么我不想编辑它。

标签: linuxsed

解决方案


使用 sed

首先让我们定义你的字符串:

$ s='my\nmulti\nline\nstring\n\n'

现在,让我们运行一个 sed 命令:

$ sed "1s/^###/$s&/" File
my
multi
line
string

### the first line

abc cba jfkdslfjslkd

这个怎么运作:

  • 1s/old/new/替代但当出现new在第一行时。oldold

  • 1s/^###/$s&/如果第一行以 . 开头,则替换$s前面 的字符串。######

警告: 字符串s不应包含任何 sed-active 字符。如果字符串s不受您的控制,则这是违反安全规定的。

使用 awk

awk 对变量进行了合理的处理,从而避免了安全问题。

$ s='my\nmulti\nline\nstring\n'
$ awk -v string="$s" 'NR==1 && /^###/ {print string} 1' File
my
multi
line
string

### the first line

abc cba jfkdslfjslkd

推荐阅读