删除两个字符串之间的所有字符串

时间:2018-12-05 15:03:20

标签: regex sed

我想问一下是否可以删除两个字符串之间的所有字符串,即使是在不同的行吗?

这是原始文件:

<?php
$CONFIG = array (
  'trusted_domains' =>
  array (
    0 => '192.168.0.32',
  ),
  'datadirectory' => '/var/www/html/files/data',
  'overwrite.cli.url' => 'http://192.168.0.44/files',
  'dbtype' => 'mysql',
  'dbport' => '',
  'installed' => true,
  'loglevel' => 2,
  'maintenance' => false,
);

我期望的是:

<?php
$CONFIG = array (
  'trusted_domains' =>
  array (

  ),
  'datadirectory' => '/var/www/html/files/data',
  'overwrite.cli.url' => 'http://192.168.0.44/files',
  'dbtype' => 'mysql',
  'dbport' => '',
  'installed' => true,
  'loglevel' => 2,
  'maintenance' => false,
);

我想清空受信任域中的所有内容。

我尝试过的事情:

sed -e 's/\(trusted_domains\).*\(\),\)/\1\2/'

2 个答案:

答案 0 :(得分:1)

使用perl可能会更容易:

perl -0777 -pe 's/(trusted_domains.*=>\s*array\s*\()[\s\S]*\),/$1\n  ),/' file.php

<?php
$CONFIG = array (
  'trusted_domains' =>
  array (
  ),
  'datadirectory' => '/var/www/html/files/data',
  'overwrite.cli.url' => 'http://192.168.0.44/files',
  'dbtype' => 'mysql',
  'dbport' => '',
  'installed' => true,
  'loglevel' => 2,
  'maintenance' => false,
);

答案 1 :(得分:1)

默认情况下,sed仅逐行操作。有一些命令和选项可用于多行操作。例如,如果您的sed支持-z选项,并且输入不包含ASCII NUL字符,则可以执行以下操作:

$ sed -zE 's/(trusted_domains[^(]+\()[^)]+/\1/' ip.txt
<?php
$CONFIG = array (
  'trusted_domains' =>
  array (),
  'datadirectory' => '/var/www/html/files/data',
  'overwrite.cli.url' => 'http://192.168.0.44/files',
  'dbtype' => 'mysql',
  'dbport' => '',
  'installed' => true,
  'loglevel' => 2,
  'maintenance' => false,
);

这将包含全部输入内容,sed将仅看到一条输入记录。因此,这不适用于大型输入文件。另外,这里假设括号不是array

内容的一部分


Perl提供了一个选项,可以选择完整的输入内容,而与出现的字符无关:

perl -0777 -pe 's/trusted_domains[^(]+\(\K[^)]+//' ip.txt