簡體   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