【问题标题】:php env.php edit from bash script using sed, awk or another tool使用 sed、awk 或其他工具从 bash 脚本编辑 php env.php
【发布时间】:2017-05-08 03:48:17
【问题描述】:

使用 bash 脚本,我正在尝试编辑 Magento 2 env.php 配置文件。 bash 脚本首先执行一些其他操作。 需要在 11-14 行的 config 文件中修改这部分:

  '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 文本编辑器中执行“搜索和替换”,我最终通过引用行号并尝试添加 sed 删除了“会话”的旧内容使用 awk 正确的内容。我已经尝试在每个句子的末尾使用反斜杠。 这是我用 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

我的猜测是我没有正确退出,但许多 Google 搜索都没有找到解决方案。

这是使用 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

我还尝试了其他一些尝试来解决我仅使用 sed 所面临的问题,但不幸的是我没有保存这些,但是它们也没有工作。

有人知道我该如何解决这个问题吗?

编辑:我正在尝试在 Debian 9 "Stretch" 上执行此编辑

编辑 2:根据我在这里收到的反馈,我在这里重新表述了这个问题:Find and replace multiple lines of text from command line

【问题讨论】:

标签: bash awk sed replace


【解决方案1】:
awk '
NR==FNR { new = new $0 ORS; next }
FNR==11 { printf "%s", new; f=1 }
!f
FNR==14 { f=0 }
' replacement.txt magento.php

【讨论】:

  • @TobySpeight 不,一如既往,你完全错了。我在您最近的 12 个答案中看到您只有 1 个被接受 - 也许如果您更多地关注您的答案而不是其他人,您将能够为网站做出更多贡献?
  • 感谢您的回答。虽然我宁愿使用搜索功能来替换我想要替换的文本块,但这个解决方案似乎确实有效。通过这样做: awk ' NR==FNR { new = new $0 ORS;下一个 } FNR==11 { printf "%s", new; f=1 } !f FNR==14 { f=0 } ' replacement.txt oldfile.php > newfile.php 我可以保存它,但是,如果我在最后一行使用:' replacement.txt oldfile。 php > oldfile.php 直接编辑而不是写入新文件,会产生一个空文件。这可能很简单,但你知道如何解决这个问题吗?
  • I'd rather use a search function to replace the block of text I want to replace - 这很容易做到,但是你告诉我们你想要替换的行号真的给了我们一个红鲱鱼。如果您想根据匹配字符串而不是行号进行替换,为什么要这样做?是的,UNIX 命令将它们的输出打印到标准输出,如果你想将标准输出重定向到一个文件,那么你可以使用&gt;
  • 好吧,我应该更清楚一点,对此感到抱歉。这是我在努力使用搜索功能两个小时后尝试的。我帖子中的最后一个代码块是尝试使用搜索和替换,但不幸的是它不起作用。
  • 感谢您的快速回复。我会尝试融入这种变化!
【解决方案2】:

如果您可以使用 GNU sed,您可以将您的文本放在一个文件中,并用 r 命令替换有问题的行。如果你不能,你需要修正你的报价。或者,你可以使用类似的东西:

{ sed 11q old_file; cat replacement_text; sed 1,14d old_file; } > new_file

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2013-08-17
    • 1970-01-01
    • 2013-06-15
    • 2012-02-10
    • 1970-01-01
    • 2020-12-22
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多