如果第一行与模式匹配,则在文件的第一行插入sed字符串

时间:2019-04-20 23:56:43

标签: linux sed

我有一个sed问题,至今找不到答案:

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

f.e。如果文件看起来像

### the first line

abc cba jfkdslfjslkd

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

my
multi
line
string

### the first line

abc cba jfkdslfjslkd

文件中的其他所有内容均不得修改。

如果文件不是以###开头,那么我不想编辑它。

3 个答案:

答案 0 :(得分:1)

使用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代替old,但是如果第一行上出现old,则仅

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

警告::字符串s不应包含任何激活sed的字符。如果字符串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

答案 1 :(得分:0)

这可能是sed中更简单的解决方案:

输入:

▶ string='my\nmulti\nline\nstring\n'
▶ cat FILE 
### the first line

abc cba jfkdslfjslkd

### other lines

解决方案:

▶ gsed -e '1{/^###/i\' -e "$string" -e '}' FILE
my
multi
line
string

### the first line

abc cba jfkdslfjslkd

### other lines"

说明:

  • 使用多个-e可以避免在sed命令中插入字符串。
  • GNU手册中提到的i\命令的GNU替代形式。

答案 2 :(得分:0)

尝试使用gnu sed和bash

if (Found)