用sed来就地与从stdin或here文档的多个行的文件替换一条线

问题描述 投票:1回答:2

我要替换多行的文件一行。我知道我可以在\n使用sed更换,但是这是比较难看。我希望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

在命令我想提出更换新的线路,以便更容易阅读/理解。到目前为止,我一直在使用here文档时,我想新的行添加到文件:

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

这已为附加/加行之有效。是否有可能做同样的事情,而是使用输出作为置换sed或者是有一些其他的方式做什么我要找的?

bash sed replace newline heredoc
2个回答
1
投票

这是你想要做什么?

$ 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

需要注意的是,以上是使用文字字符串操作,所以它会为它会失败给/s或任何ERE正则表达式字符或捕获组或反向引用或旧或新的字符串不像sed脚本,任何字符工作...输入(见Is it possible to escape regex metacharacters reliably with sed了解详细信息)。


1
投票

这可能会为你工作(GNU SED):

cat <<! | sed -i -e '/^DINGO/r /dev/stdin' -e '//d' file
# added by $(whoami) on $(date)
DINGO=howdy
!

这将替换起始DINGO与被管道输送到作为标准输入sed命令内的文件在这里文档线。

替代:

cat <<! | sed -i -e '/^DINGO/e cat /dev/stdin' -e 's/bingo/howdy' file
# added by $(whoami) on $(date)
!

注:在替代解决方案在这里,DOC将只读取一次!

© www.soinside.com 2019 - 2024. All rights reserved.