使用sed、awk或其他工具从bash脚本编辑php env.php
使用bash脚本,我试图编辑Magento 2 env.php配置文件。 bash脚本首先执行一些其他操作。 它需要在第11-14行的配置文件中更改此部分:使用sed、awk或其他工具从bash脚本编辑php env.php,bash,awk,sed,replace,Bash,Awk,Sed,Replace,使用bash脚本,我试图编辑Magento 2 env.php配置文件。 bash脚本首先执行一些其他操作。 它需要在第11-14行的配置文件中更改此部分: 'session' => array ( 'save' => 'files', ), 为此: 'session' => array ( 'save' => 'redis', 'redis' => array ( 'host' =>
'session' =>
array (
'save' => 'files',
),
为此:
'session' =>
array (
'save' => 'redis',
'redis' =>
array (
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'timeout' => '2.5',
'persistent_identifier' => '',
'database' => '0',
'compression_threshold' => '2048',
'compression_library' => 'gzip',
'log_level' => '1',
'max_concurrency' => '6',
'break_after_frontend' => '5',
'break_after_adminhtml' => '30',
'first_lifetime' => '600',
'bot_first_lifetime' => '60',
'bot_lifetime' => '7200',
'disable_locking' => '0',
'min_lifetime' => '60',
'max_lifetime' => '2592000'
)
),
'cache' =>
array(
'frontend' =>
array(
'default' =>
array(
'backend' => 'Cm_Cache_Backend_Redis',
'backend_options' =>
array(
'server' => '127.0.0.1',
'database' => '0',
'port' => '6379'
),
),
'page_cache' =>
array(
'backend' => 'Cm_Cache_Backend_Redis',
'backend_options' =>
array(
'server' => '127.0.0.1',
'port' => '6379',
'database' => '1',
'compress_data' => '0'
)
)
)
),
我曾尝试使用各种方法实现sed和awk,并且已经花了好几个小时,但我无法找出我做错了什么。我以前没有使用sed、awk或shell脚本的经验。在我无法实现我真正想要的,在每个GUI文本编辑器中都可以执行的“搜索和替换”之后,我最终通过引用行号并尝试使用awk添加正确的内容来删除sed的旧内容。我已经试过在每句话的结尾使用反斜杠了。
这是我用sed和awk编写的脚本,在第一次尝试使用以下方法正确实现这一点之后:
sed -i -e 12d -e 13d -e 14d /var/www/ecom/app/etc/env.php
awk '
{ print }
/ 'session' => / {
print " array ( "
print " 'save' => 'redis',"
print " 'redis' =>"
print " array ("
print " 'host' => '127.0.0.1',"
print " 'port' => '6379',"
print " 'password' => '',"
print " 'timeout' => '2.5',"
print " 'persistent_identifier' => '',"
print " 'database' => '0',"
print " 'compression_threshold' => '2048',"
print " 'compression_library' => 'gzip',"
print " 'log_level' => '1',"
print " 'max_concurrency' => '6',"
print " 'break_after_frontend' => '5',"
print " 'break_after_adminhtml' => '30',"
print " 'first_lifetime' => '600',"
print " 'bot_first_lifetime' => '60',"
print " 'bot_lifetime' => '7200',"
print " 'disable_locking' => '0',"
print " 'min_lifetime' => '60',"
print " 'max_lifetime' => '2592000'"
print " )"
print " ),"' /var/www/html/app/etc/env.php
然而,我得到的结果是:
awk: cmd. line:27: print " ), "
awk: cmd. line:27: ^ unexpected newline or end of string
我的猜测是,我没有正确退出,但大量的谷歌搜索并没有找到解决方案
这是使用cat和sed的另一次尝试,它也不起作用,并导致一个空文件:
cat <<EOF <(sed -i '1,/ 'session' => \n array (\n 'save' => 'files',\n ),/d' /var/www/html/app/etc/env.php) >> /var/www/html/app/etc/env.php
'session' =>
array (
'save' => 'redis',
'redis' =>
array (
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'timeout' => '2.5',
'persistent_identifier' => '',
'database' => '0',
'compression_threshold' => '2048',
'compression_library' => 'gzip',
'log_level' => '1',
'max_concurrency' => '6',
'break_after_frontend' => '5',
'break_after_adminhtml' => '30',
'first_lifetime' => '600',
'bot_first_lifetime' => '60',
'bot_lifetime' => '7200',
'disable_locking' => '0',
'min_lifetime' => '60',
'max_lifetime' => '2592000'
)
),
'cache' =>
array(
'frontend' =>
array(
'default' =>
array(
'backend' => 'Cm_Cache_Backend_Redis',
'backend_options' =>
array(
'server' => '127.0.0.1',
'port' => '6379'
),
),
'page_cache' =>
array(
'backend' => 'Cm_Cache_Backend_Redis',
'backend_options' =>
array(
'server' => '127.0.0.1',
'port' => '6379',
'database' => '1',
'compress_data' => '0'
)
)
)
),
EOF
cat>/var/www/html/app/etc/env.php
“会话”=>
排列(
“保存”=>“redis”,
“redis”=>
排列(
“主机”=>“127.0.0.1”,
“端口”=>“6379”,
'密码'=>'',
“超时”=>“2.5”,
“持久标识符”=>“”,
“数据库”=>“0”,
“压缩阈值”=>“2048”,
“压缩库”=>“gzip”,
“日志级别”=>“1”,
“最大并发”=>“6”,
“前端后中断”=>“5”,
'在\u adminhtml'=>'30'之后中断\u,
“第一个生命周期”=>“600”,
“机器人第一次生命周期”=>“60”,
“机器人寿命”=>“7200”,
“禁用锁定”=>“0”,
“最小寿命”=>“60”,
“最大使用寿命”=>“2592000”
)
),
“缓存”=>
排列(
“前端”=>
排列(
“默认值”=>
排列(
'backend'=>'Cm\u Cache\u backend\u Redis',
“后端_选项”=>
排列(
'服务器'=>'127.0.0.1',
“端口”=>“6379”
),
),
“页面缓存”=>
排列(
'backend'=>'Cm\u Cache\u backend\u Redis',
“后端_选项”=>
排列(
'服务器'=>'127.0.0.1',
“端口”=>“6379”,
'数据库'=>'1',
“压缩数据”=>“0”
)
)
)
),
EOF
我还尝试用sed来解决我面临的这个问题,但不幸的是我没有保存它们,但是它们也不起作用
有人知道我怎么解决这个问题吗
编辑:我试图在Debian 9“Stretch”上执行此编辑
编辑2:根据我在这里收到的反馈,我在这里重新表述了这个问题:如果您可以使用GNU
sed
,您可以将文本放入文件中,并用r
命令替换有问题的行。如果你不能,你需要修正你的报价。或者,您可以使用以下内容:
{ sed 11q old_file; cat replacement_text; sed 1,14d old_file; } > new_file
欢迎来到堆栈溢出。祝贺你提出第一个问题。也许你想做的是@TobySpeight不,因为你总是大错特错。我看到在你最近的12个答案中,你只有1个被接受-也许如果你更多地关注你的答案而不是其他人,你就能为网站贡献更多?谢谢你的答案。虽然我宁愿使用搜索功能来替换我要替换的文本块,但这个解决方案似乎确实有效。通过这样做:awk'NR==FNR{new=new$0 ORS;next}FNR==11{printf“%s”,new;f=1}!f FNR==14{f=0}replacement.txt oldfile.php>newfile.php我可以保存它,但是,如果我最后一行使用这句话:“replacement.txt oldfile.php>oldfile.php直接编辑而不是写入新文件,它会导致一个空文件。这可能很简单,但你知道如何解决这个问题吗?
我宁愿使用搜索功能来替换我要替换的文本块
-这很容易做到,但是你告诉我们你要替换的行号,这真的让我们吃了一惊。如果您想基于匹配字符串而不是行号进行替换,为什么要这样做?是的,UNIX命令将其输出打印到stdout,如果您想将stdout重定向到一个文件,那么您可以使用
执行此操作。好吧,我可能应该更清楚一些,对此表示抱歉。这是我在使用搜索功能苦苦挣扎了两个小时后尝试的。我文章中的最后一个代码块是尝试使用搜索和替换,但不幸的是它不起作用。谢谢你的快速回复。我将尝试合并这一变化!
{ sed 11q old_file; cat replacement_text; sed 1,14d old_file; } > new_file