繁体   English   中英

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

[英]Sed insert string at first line of file if the first line matches pattern

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

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

fe 如果文件看起来像

### the first line

abc cba jfkdslfjslkd

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

my
multi
line
string

### the first line

abc cba jfkdslfjslkd

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

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

使用 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-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

这可能是 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 替代形式。

尝试使用 gnu sed 和 bash

$ a='my\nmulti\nline\nstring'; echo -e $a
my
multi
line
string

$  sed -Ee "0,/^###/{/^###/i$a" -e '}' file*

my
multi
line
string
### the first line

abc cba jfkdslfjslkd

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM