我有这个多行文档,我希望将其转换为单行字符串:
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.ini
and /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