首页 > 解决方案 > 使用 sed 将文件中的一行替换为来自标准输入或 HEREDOC 的多行

问题描述

我想用多行替换文件中的一行。我知道我可以\nsed替换中使用,但这很丑陋。我希望听到 HEARDOCs。

所以我可以这样做以用多行替换该行:

$ cat sedtest
DINGO=bingo

$ sed -i -e "s/^DINGO.*$/# added by $(whoami) on $(date)\nDINGO=howdy/" sedtest

$ cat sedtest
# added by user on Sun Feb  3 08:55:44 EST 2019
DINGO=howdy

在命令中,我想将替换放在新行中,以便更容易阅读/理解。到目前为止,当我想向文件添加新行时,我一直在使用 HEREDOC:

CAT << EOF | sudo tee -a file1 file2 file3
line one
line two
line three
EOF

这对于追加/添加效果很好。是否可以做类似的事情,而是使用输出作为替代品,sed或者是否有其他方法可以做我正在寻找的事情?

标签: bashsedreplacenewlineheredoc

解决方案


这是你想要做的吗?

$ awk 'NR==FNR{new=(NR>1?new ORS:"") $0;next} $0=="DINGO=bingo"{$0=new} 1' - file <<!
# added by $(whoami) on $(date)
DINGO=howdy
!
# added by user on Sun, Feb  3, 2019  8:50:41 AM
DINGO=howdy

请注意,上面使用的是文字字符串操作,因此它适用于旧字符串或新字符串中的任何字符,这与您的 sed 脚本不同,如果给定/s 或任何 ERE 正则表达式字符或捕获组或反向引用或...在输入(有关详细信息,请参阅是否可以使用 sed 可靠地转义正则表达式元字符)。


推荐阅读