【问题标题】:extract lines that their columns contains only a certain pattern提取其列仅包含特定模式的行
【发布时间】:2016-09-28 05:32:56
【问题描述】:

我有一个包含一些行的文件 那行看起来像这样:

zadde205554800156569001
sfsdf848532300258112668
fsdfs552258800556220056
.
.
.
dzaed686745800158748048 

我希望只使用一些 awk 和正则表达式从第 13 列开始获取包含 001005 的行

所以输出应该是这样的:

zadde205554800156569001
fsdfs552258800556220056     
dzaed686745800158748048

我尝试了一些 grep 命令但没有成功

【问题讨论】:

  • 你尝试的正则表达式是什么?还没有测试过,但可能类似于:/.{12}(?=.*00(?:1|5)).+/ 带有. 不匹配换行符的选项。

标签: regex file unix awk grep


【解决方案1】:

说明

^.{12}(?:001|005)

此正则表达式将执行以下操作:

  • 允许字符串以任意 12 个字符开头
  • 要求字符串在第 13 个字符处包含子字符串 001005

示例

现场演示

https://regex101.com/r/lQ2oD6/1

示例文本

zadde205554800156569001
sfsdf848532300258112668
fsdfs552258800556220056
.
.
.
dzaed686745800158748048 

示例匹配

zadde205554800156569001
fsdfs552258800556220056
dzaed686745800158748048 

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  ^                        the beginning of a "line"
----------------------------------------------------------------------
  .{12}                    any character except \n (12 times)
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    001                      '001'
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    005                      '005'
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------

【讨论】:

  • 但是001005 不一定从第13个字符开始,而是第13个字符开始。
  • @Xufox,这在问题中并不明显 - 但您可以轻松地使用 .{12,} 匹配任何十二个或更多字符。或者干脆删除行开始匹配。
【解决方案2】:
$ awk '/.{12}00[15]/' file
zadde205554800156569001
fsdfs552258800556220056
dzaed686745800158748048

$ grep -E '.{12}00[15]' file
zadde205554800156569001
fsdfs552258800556220056
dzaed686745800158748048

$ sed -E -n '/.{12}00[15]/p' file
zadde205554800156569001
fsdfs552258800556220056
dzaed686745800158748048

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
  • 不,不会。这就像用increment i 评论i++。如果您不了解基础知识,则查找手册页会有好处。
  • 更像是在评论i++ 时使用后增量i,因为如果解释得当,我们承诺会在此处返回旧值。那是国际海事组织,我认为你的意见不同,所以我就这样吧。
猜你喜欢
  • 2013-12-01
  • 2013-05-19
  • 1970-01-01
  • 2022-01-22
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
相关资源
最近更新 更多