我有一个这种模式的文件:
Some text
---
## [Unreleased]
More text here
我需要用shell脚本中的其他内容替换'---'和'## [Unreleased]'之间的文本。
如何使用sed或awk实现?
答案 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
解决方案:
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