我要替换多行的文件一行。我知道我可以在\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
或者是有一些其他的方式做什么我要找的?
这是你想要做什么?
$ 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了解详细信息)。
这可能会为你工作(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将只读取一次!