![](/img/trans.png)
[英]How to insert a line before the FIRST and LAST matching pattern using 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
文件中的任何其他內容都不應被修改。
如果文件不以###
開頭,那么我不想編輯它。
首先讓我們定義你的字符串:
$ 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 對變量進行了合理的處理,這避免了安全問題。
$ 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 命令中。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.