【问题标题】:Grepping( using a regular expression ) for a newline character within square brackets [ ]Grepping(使用正则表达式)方括号 [] 内的换行符
【发布时间】:2016-07-27 23:58:23
【问题描述】:

我想在一行文本中查找所有减号实例,后跟一个数字。数字用逗号分隔,但也可以在行尾

text.txt 包含

hx,-7,u,-9,u,-8

(末尾有换行符)

我正在运行这个命令

egrep -o ',[\-][0-9][\n,]' text.txt 

得到

,-7,
,-9,

但我想得到

,-7,
,-9,
,-8

编辑: 像

hx,-7,u/-9,u,-8

应该还是会产生

,-7,
,-9,
,-8

并使用

egrep -o ',[\-](1|2)?[0-9XY][\,$]' text.txt

不适合

【问题讨论】:

  • 您可以将最后一个字符类更改为[^0-9]
  • grep 中使用$ 锚作为行尾就足够了。 *nix 中的文本文件使用\n 来终止一行。试试egrep -o ',[\-][0-9](,|$)' text.txt
  • @alvits 谢谢,这不是我的问题,但实际上除了“,”或 \n 之外,还有更多选项,数字也可以由“/”字符代替。所以我需要 egrep -o ',[\-](1|2)?[0-9XY][\/,$]' text.txt 之类的东西,但这不适用于 "$"
  • 您的帖子必须全面。我们为您提出的问题提供解决方案,但我们当然无法预测或阅读您的想法。对于您希望完成的新要求,您可以使用egrep -o ',[\-][0-9](\/|,|$)' text.txt。我希望你不要回过头来说这个数字也可以跟别的东西。最后一个正则表达式 (\/|,|$) 表示这 3 个 /,$ 中的任何一个都应该在数字之后。如果您有更多,只需将它们添加到列表中。 |or 意味着其中之一。
  • 如果您的数字后面有多个字符,您可以使用([\/,]|$) 作为最后一个正则表达式。这意味着包含在[]| 中的这些字符之一,行尾$ 应该跟在数字后面。

标签: regex grep newline


【解决方案1】:

grep 以每行为基础工作,换行符不匹配,因为它们被视为每行的分隔符。

How to give a pattern for new line in grep? 表示pcregrep 可以执行多行 grep 操作。

或者,您可以使用tr\n 字符转换为,,即:

cat text.txt | tr '\n' ',' | egrep -o ',[\-][0-9][\n,]'

产量:

,-7,
,-9,
,-8,

【讨论】:

  • OP 不是在寻找多行匹配 grep 但很容易被误读。但是,您的解决方案是个坏主意。首先,您将连接文件的所有行。想象一下,如果输入文件是一个日志。正如您所指出的,grep 是面向行的。想象一下在将所有行连接成一行之后它必须解析的长行。
  • 同意。原始语句问题陈述只是表明文本文件包含一行。您的锚定解决方案更受欢迎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多