替换一段文字

时间:2017-01-10 13:54:21

标签: regex shell awk sed

我有一个这种模式的文件:

Some text
---

## [Unreleased]
More text here

我需要用shell脚本中的其他内容替换'---'和'## [Unreleased]'之间的文本。
如何使用sed或awk实现?

5 个答案:

答案 0 :(得分:1)

Perl救援!

perl -lne 'my @replacement = ("First line", "Second line");
           if ($p = (/^---$/ .. /^## \[Unreleased\]/)) {
               print $replacement[$p-1];
           } else { print }'

触发器操作符..告诉您是否在两个字符串之间,并且它返回相对于范围的行号。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/^---/,/^## \[Unreleased\]/c\something else' file

将两个正则表达式之间的行更改为所需的字符串。

答案 2 :(得分:0)

awk -v RS="\0" 'gsub(/---\n\n## \[Unreleased\]\n/,"something")+1' file

尝试一下这条线。

答案 3 :(得分:0)

此示例可能对您有所帮助。

$ cat f
Some text
---

## [Unreleased]
More text here

$ seq 1 5  >mydata.txt

$ cat mydata.txt 
1
2
3
4
5

$ awk '/^---/{f=1; while(getline < c)print;close(c);next}/^## \[Unreleased\]/{f=0;next}!f' c="mydata.txt"  f
Some text
1
2
3
4
5
More text here

答案 4 :(得分:0)

awk解决方案:

  • 是便携式的(符合POSIX标准)。
  • 可以处理块的起始行和结束行之间的任意行数,并且可能处理多个块(尽管它们都被相同的文本替换)。
  • 逐行读取文件(而不是一次读取整个文件)。
awk -v new='something else' '
 /^---$/ { f=1; next }                               # Block start: set flag, skip line
 f && /^## \[Unreleased\]$/ { f=0; print new; next } # Block end: unset flag, print new txt 
 ! f                                                 # Print line, if before or after block
' file