![](/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.