【问题标题】:sed regex not compatible with PHP regexsed 正则表达式与 PHP 正则表达式不兼容
【发布时间】:2017-12-18 09:45:14
【问题描述】:

这里要更改的文字:

'db' => [
        'connectionString' => 'mysql:host=localhost;dbname=bob',
        'emulatePrepare' => true,
        'username' => 'local',
        'password' => 'local',
        'charset' => 'utf8',
    ],

预期结果:

'db' => [
        'connectionString' => 'mysql:host=localhost;dbname=bob',
        'emulatePrepare' => true,
        'username' => 'alice',
        'password' => 'local',
        'charset' => 'utf8',
    ],

sed 命令:

sed -E "s#('db'[ ]*=>[ ]*\[)((\n*?.*?|^\t*.*\n)*)('username'[ ]*=[ ]*>[ ]*)'.*'#\1\2\4'alice'#" textTochange.txt

我的正则表达式在https://regex101.com/ 上工作没有问题,在 PHP 中使用 preg_replace 像魅力一样工作,但没有 sed :(

【问题讨论】:

  • php 使用与sed 不兼容的正则表达式风格。此外,您正在匹配多行字符串。 perlawk 更适合这种情况。
  • 感谢您的帮助@anubhava!我已经用答案编辑了我的问题:)
  • @GillesGrandguillaume 解决方案应该放在答案中,而不是问题中。您可以回答自己的问题。
  • @Barmar 好的,完成。

标签: php bash sed


【解决方案1】:

这里的解决方法:

perl -0pe "s#('db'[ ]*=>[ ]*\[)((\n*?.*?|^\t*.*\n)*)('username'[ ]*=[ ]*>[ ]*)'.*'#\1\2\4'alice'#m" textTochange.txt

【讨论】:

    【解决方案2】:

    用 awk 试试。

    awk -v s1="'" '/db/{A=1} A && /username/{sub(/username.*/,"username" s1 "=> " s1 "alice" s1 ",",$0)} /],/{A=""} 1'   Input_file
    

    稍后也会添加说明。

    EDIT1:现在也成功添加了非单线形式的解决方案。

    awk -v s1="'" '
                    /db/{
                            A=1
                        }
                    A && /username/{
                                    sub(/username.*/,"username" s1 "=> " s1 "alice" s1 ",",$0)
                                   }
                    /],/{
                            A=""
                        }
                    1
                  '   Input_file
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多