【问题标题】:How to delete the pattern between start of the pattern and a line before the end pattern using sed or perl command?如何使用 sed 或 perl 命令删除模式开始和结束模式前一行之间的模式?
【发布时间】:2013-10-13 12:52:20
【问题描述】:

这是输入文件

{1:IRVTUS30XXX}{2:I304dfaffaefa}{3:fewfa]}
:15A:
:20:1234556
:22:dsafas
dsafafaf
erwfafgr
:23:fewfd
:24:firh
:60:uncenjnjcdv
:72:uenuernfk
12345
-}

这里我想从输入文件中删除一些标签信息。 (标签是:15A::22:在冒号之间的称为标签)

如果我想删除标签 20,我可以使用下面的 perl 命令:

perl -i -pe 's/:20:(.*)\r\n//g' file

但是对于像 :22: 或 :72 这样的标签:它的多行标签.. 我怎样才能删除那些?

【问题讨论】:

  • whciha re,这是一个令人震惊的错字。
  • 这里提示:要匹配多行字符串,不能逐行读取文件。
  • 根据你展示的数据,我们必须推断出格式的规则,这并不明显——它不是一种常见的格式。似乎以{ 开头的行作为“组开始”标记可能具有一定的意义。似乎有“标签”,它们是以冒号、2 或 3 个字母数字和另一个冒号开头的行;这些可能后面是非空数据,可能分布在几行中,其中连续行不以标签开头。还有一些行包含-};目前尚不清楚这是否只是前一个标签 (:72:) 数据的一部分或其他内容。
  • 不过,我们真的不应该对此进行猜测;你应该告诉我们格式的规则,所以我们知道-} 行是保留还是删除。这对您来说可能很明显;这对局外人来说并不明显。
  • 对不起.. -} 是消息的结尾,因此不应将其作为标签 72 的一部分删除..

标签: regex perl sed ksh


【解决方案1】:

在这里,您可以选择两个标签号的表达式。 22 和标签号。 72

:(72|22):([\w\d]*(\r?\n|\r\n?)+)+

Here 是匹配测试。

【讨论】:

  • 您可能错过了问题的多行匹配部分。另外,(\r?\n|\r\n?)+ 最好写成[\r\n]+
【解决方案2】:

删除标记 22 的示例代码(适用于多行或单行):

% perl -00 -pe 's/^:22:.*?(?=(?:^:\d+\w*|$))//ms' file.txt
{1:IRVTUS30XXX}{2:I304dfaffaefa}{3:fewfa]}
:15A:
:20:1234556
:23:fewfd
:24:firh
:60:uncenjnjcdv
:72:uenuernfk
12345
-}

【讨论】:

  • 这似乎是在删除这些行,但我在已删除标签的位置看到空行,并且后续标签也没有被删除..
猜你喜欢
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
相关资源
最近更新 更多