将文本行添加到变量中的特定行

时间:2014-03-05 14:26:29

标签: bash shell sed

我有以下文件CHANGELOG.rst

some text
=========

header
------

* list
* list

header
------

* list

我需要在文件标题后面添加一个条目,以便更新后的文件如下所示:

some text
=========

new header
----------

* new list

header
------

* list
* list

header
------

* list

我添加了

new header
----------

* new list

部分已存在于$CHANGES变量中。

我知道这可以用sed完成,但我不知道如何处理它。

6 个答案:

答案 0 :(得分:3)

使用sed

sed -i '/PATTERN/a  Line which you want to append' filename

-i用于就地替换

对于你的例子:

sed -i "/=========/a ${CHANGES}" file

some text
=========

new header
----------

* new list

header
------

* list
* list

header
------

* list

答案 1 :(得分:1)

我不会使用sed将值注入文本文件。我会使用ed

ed file <<EOF
4i
$yourtext
.
w
EOF

这就是说,

  1. “开始插入第四行”
  2. 插入“$ yourtext”
  3. 停止插入
  4. 写入。

答案 2 :(得分:1)

如果您想确保仅在第一次出现时执行此操作,请使用以下内容:

CHANGES="line1\nline2"
sed -i "0,/\(^=\+$\)/s//\1\n${CHANGES}/" filename

答案 3 :(得分:0)

以下是使用grep:

丑陋解决方案
grep -B100000 "=========" CHANGELOG.rst > new.txt
echo >> new.txt
echo "new header" >> new.txt
echo "----------" >> new.txt
echo >> new.txt
echo "\* new list" >> new.txt
echo >> new.txt
grep -A100000 "=========" CHANGELOG.rst >> new.txt

grep -A获取匹配字符串后的行,grep -B获取后面的行。仅当您要分割文件的匹配字符串仅存在一次时,它才有效。

答案 4 :(得分:0)

sed '/^header/ i\
your content like New Header\
and his content
' YourFile

但这会发生在每个标题

具体(根据要求)

sed '/^header/ i\
new header\
----------\
\
* new list\

' YourFile

答案 5 :(得分:0)

我能够在this stackoverflow回答中找到我的问题的解决方案。

感谢@ mklement0,代码为:

sed -i "4 i\
${CHANGES//$'\n'/\\$'\n'}" ./CHANGELOG.rst