sed:用标准输入替换多行块

sed:用标准输入替换多行块

鉴于input_file

1
2
START
foo
END
3

目标START是将 include ...块内的内容替换END为来自 stdin 的多行内容:

1
2
hello 
world
3

我尝试过的:

sed '/^START$/,/^END$/d;r /dev/stdin' input_file <<EOF 
hello
world
EOF

不幸的是导致

1
hello
world
2
3

我猜r /dev/stdin是按顺序调用的 /^START$/,/^END$/d;并仅附加在第一行之后。

第二次尝试:

sed '/^START$/,/^END$/{d;r /dev/stdin
}' input_file <<EOF     
hello
world
EOF

印刷

1
2
3

为什么上述命令(尤其是最后一个命令)会打印错误的结果?我该如何调整这些?

答案1

在您的第一次尝试中,地址范围仅有效d。 ( append r /dev/stdin...) 已在第一行完成;此后,它会遇到文件结尾。在您的第二次尝试中,脚本没有遇到该r命令。man sed:

  d      Delete pattern space.  Start next cycle.

所以d命令之后的所有内容都会丢失(相关地址范围内);事实并非如此r /dev/stdin

试试这个来实现你的目标:

sed -e '/^START$/,/^END$/ { r /dev/stdin' -e';d};' file3 <<EOF 
hello
world
EOF

1
2
hello
world
3

当满足地址范围时首先读取,然后删除该地址范围。

相关内容