从多行heredocument到单行herestring,带换行符

从多行heredocument到单行herestring,带换行符

我有这个多行文档,我希望将其转换为单行字符串:

cat <<-"PHPCONF" > /etc/php/*/zz_overrides.ini
  [PHP]
  post_max_size = 200M
  upload_max_filesize = 200M
  cgi.fix_pathinfo = 0
PHPCONF

我能得到的最接近的结果如下:

cat >"/etc/php/*/zz_overrides.ini" <<< "[PHP] post_max_size = 200M upload_max_filesize = 200M cgi.fix_pathinfo = 0"

但我不认为换行符在每个指令可行之后,假设最终结果为一细绳。也许毕竟有一些“非正统”的方式?


Heredoc 和 Herestring 都旨在取代这个繁重的 sed 操作:

sed -i "s/post_max_size = .M/post_max_size = 200M/ ; s/upload_max_filesize = .M/upload_max_filesize = 200M/ ; s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php/*/fpm/php.ini

答案1

抛开您可以这样的事实printf "this\nthat\n" > /some/file,您可以使用例如 ANSI-C 引用来创建带有换行符的here-string:

$ cat <<< $'this\nthat'
this
that

另外,由于引号的原因,这将尝试在字面名为 的目录中创建一个文件*

cat > "/etc/php/*/zz_overrides.ini"

这在 Bash 中有效,但前提是 glob 匹配一个文件(如果有/etc/php/foo/zz_overrides.iniand /etc/php/bar/zz_overrides.ini,Bash 会给出错误)

cat > /etc/php/*/zz_overrides.ini

答案2

我认为bash允许您直接使用带有换行符的字符串,不需要heredoc,或调用外部命令(例如cat):

$ php_conf='
  [PHP]
  post_max_size = 200M
  upload_max_filesize = 200M
  cgi.fix_pathinfo = 0
'

$ echo "$php_conf"

 [PHP]
 post_max_size = 200M
 upload_max_filesize = 200M
 cgi.fix_pathinfo = 0

相关内容