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

标签 linux sed

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

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

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

### 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 活跃字符。如果字符串 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

关于linux - 如果第一行与模式匹配,sed 在文件的第一行插入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778736/

相关文章:

python - 在Debian Linux(Raspberry Pi)上使用cv2 Python禁用GUI栏

regex - 使用字符串替换取消注释基于正则表达式的配置行

linux - Sed:替换日期格式

linux - 仅当当前行中存在字符串时才替换

linux - 使用变量替换每隔两次出现的模式

linux - du 计算文件大小的硬链接(hard link)?

c++ - 发送USR2信号后忽略信号处理程序

linux - 并行运行 top 和 free-m 命令

linux:复制文件夹的正确方法是什么?

linux - 在本地编辑文件的多行,然后多次重命名 - Linux