标签: regular-expression

仅当第一行匹配特定模式时如何打印文件内容?

我正在编写一个脚本,我想检查文件的第一行是否与某个模式匹配,如果匹配,则打印出文件。我怎样才能做到这一点?

我如何检查模式?有没有办法检查模式并根据输出做一些事情..

编辑:请看一下这个问题:https : //stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file

我想要这样的东西,但没有一个对我有用。我基本上想检查第一行是否与正则表达式模式匹配,并根据它打印文件行。

text-processing regular-expression files

11
推荐指数
5
解决办法
5082
查看次数

[[.ch.]] 在正则表达式中是什么意思?

替代标题:什么是符合 POSIX 的正则表达式中的“整理序列”或“整理元素”?

在 POSIX 规范的第 9.3.5 节中找到了确切的技术定义,作为列表中的第 4 项,但我不太清楚。

我在网上搜索示例和解释,并没有完全空手而归,但绝对没有开悟

我唯一得到的是,在某些情况下,您可以让您的正则表达式将多个字符视为单个字符,以便进行长度比较和确定“最长匹配”是什么(因为正则表达式是贪婪的并且返回最长的匹配)。

仅此而已吗?我很难看到它的用途,但我怀疑我的理解不完整。 正则表达式的“整理”实际上是什么? 以及如何[[.ch.]]在POSIX规范的例子,涉及到这个?

terminology posix regular-expression

11
推荐指数
1
解决办法
615
查看次数

grep 从固定文本开始,直到第一个空行

我有一个prova.txt这样的文件:

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

extra1
extra2
bla

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

extra2
bla
bla

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131
Run Code Online (Sandbox Code Playgroud)

我需要从“开始抓住这里”到第一个空行。输出应该是这样的:

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

Start to grab from here: 1 …
Run Code Online (Sandbox Code Playgroud)

sed awk sort regular-expression

11
推荐指数
1
解决办法
1万
查看次数

如何或为什么使用`.*?` 比`.*` 更好?

在 SuperUser 上回答了这个问题,该问题与 grepping 输出时使用的正则表达式类型有关。

我给出的答案是这样的:

 tail -f log | grep "some_string.*some_string"
Run Code Online (Sandbox Code Playgroud)

然后,在对我的回答@Bob 的三个评论中写道:

.*是贪婪的,可能会捕获比您想要的更多。.*?通常更好。

那么这个,

?是 上的修饰符*,使其变得懒惰而不是贪婪的默认值。假设 PCRE。

我用谷歌搜索PCRE,但无法在我的答案中得到这有什么意义?

最后这个,

我还应该指出这是正则表达式(默认情况下 grep 执行 POSIX 正则表达式),而不是 shell glob。

我只知道 Regex 是什么以及它在 grep 命令中的基本用法。所以,我无法得到这 3 条评论中的任何一条,我有这些问题:

  • .*?vs. 的用法有什么区别.*
  • 在什么情况下哪个更好?请举例说明。

理解评论也会有帮助,如果有人可以的话


更新:作为问题的答案Regex 与 Shell Globs 有何不同? @Kusalananda在他的评论中提供了这个链接

注意:如果需要,请在回答参考上下文之前阅读我对这个问题的回答。

regular-expression wildcards

11
推荐指数
2
解决办法
2605
查看次数

如何在awk regex中引用一个regex组?

如何在 awk regex 中引用正则表达式组?例如,如果我有一个正则表达式组(\w),我以后如何在同一个正则表达式中引用它(\w)\1?awk 支持这个功能吗?下面的例子不起作用。

# In this example, I want to change aa to aaa and cc to ccc.
echo ab aa cc de mn | gawk '{print gensub(/(\w)\1/, "\\1\\1\\1", "g")}'
# The result is: ab aa cc de mn
# The expected result is: ab aaa ccc de mn
Run Code Online (Sandbox Code Playgroud)

awk regular-expression

11
推荐指数
3
解决办法
9770
查看次数

为什么我必须在 grep 的正则表达式中引用转义字符,而不是在在线正则表达式引擎上?

我确定这个问题的某些版本之前已经被问过和回答过,但我环顾四周并没有找到确切的答案。也许这里有人可以帮我点亮灯泡。我在 Mac 上使用 Mojave 10.14.6 和 bash 3.2.57(1)-release。

我正在通过在线教程学习正则表达式的基础知识,并在在线网站https://regexr.com上练习,并grep在我的本地机器上使用bash。

我正在练习一个包含三个内容的小文本文件(称为 small.txt):

9.00
9-00
9500
Run Code Online (Sandbox Code Playgroud)

我知道.通配符将匹配该位置的任何一个字符。因此,在我使用的在线正则表达式引擎 (JavaScript) 中, /9.00/g将匹配所有三个字符串9.00 9-009500.

如果我grep在命令行上使用也是一样的:

~/bin $ grep 9.00 small.txt
9.00
9-00
9500
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。教程说,要将.元字符转换为文字,您必须对其进行转义。好的。所以放入/9\.00/g在线正则表达式框只会匹配9.00,正如预期的那样,而不是 9-00 或 9500。太好了。

但是,如果我grep在命令行中输入相同的语法,则会得到意想不到的结果:

~/bin $ grep 9\.00 small.txt
9.00
9-00
9500
Run Code Online (Sandbox Code Playgroud)

和之前一样。为了开始grep工作,我要么必须双引号整个字符串:

~/bin $ grep "9\.00" small.txt
9.00
Run Code Online (Sandbox Code Playgroud)

或者只是双引号转义字符:

~/bin $ grep 9"\."00 small.txt
9.00
Run Code Online (Sandbox Code Playgroud)

很可能还有其他一些我可以做出的引用选择,这也会给我正确的结果。

这让我很难理解正则表达式的基础知识,因为很明显,我首先必须了解 …

grep bash regular-expression

11
推荐指数
2
解决办法
1265
查看次数

为什么有些正则表达式命令对不同字符的 '\' 有相反的解释?

以这个命令为例:

find . -regex ".*\.\(cpp\|h\)"
Run Code Online (Sandbox Code Playgroud)

这将在您的目录中找到所有 .h 和 .cpp 文件。句点字符“.” 在正则表达式中通常表示“任何字符”。要使其仅匹配实际句点,您必须使用反斜杠字符 '\' 对其进行转义。

在这种情况下,给定一个具有特殊含义的字符,您必须对其进行转义以获取它所代表的实际字符。

现在,取括号和“或”栏,分别是字符 '(', ')' 和 '|'。这些也有特殊含义,用于对正则表达式进行分组。但是,要获得特殊含义,必须使用反斜杠对字符进行转义!没有反斜杠,字符具有它所代表的实际字符的含义。

为什么是“.” 与 '(', ')' 和 '|' 区别对待?

find regular-expression

10
推荐指数
1
解决办法
526
查看次数

grep 表示不超过一定长度的单词

我正在寻找一种方法来 grep 类似的东西:i log for E M, i 1 f x i 0, I xi 1, 3 1,.简单地基于字符数。

该假设输出中的任何内容都不超过三个字符。这个假设的单线看起来像,grep -v [:alnum:] > {3}。(除了我不知道如何用 grep 语法编写它。)

grep regular-expression

10
推荐指数
1
解决办法
4万
查看次数

如何将字母行的文本与shell中的数字行合并?

我有一个包含如下文本的文件:

AAAA
BBBB
CCCC
DDDD

1234
5678
9012
3456

EEEE 

7890
Run Code Online (Sandbox Code Playgroud)

等等...

我想将字母行与数字行匹配起来,所以它们是这样的:

AAAA 1234 
BBBB 5678
CCCC 9012
DDDD 3456

EEEE 7890
Run Code Online (Sandbox Code Playgroud)

有谁知道实现这一目标的简单方法?

scripting shell-script text-processing regular-expression merge

10
推荐指数
1
解决办法
1161
查看次数

正则表达式的定义是什么?

我最近与Ghoti就我对这个问题的回答的评论中的正则表达式的构成进行了友好的争论。我声称以下是正则表达式:

`[Rr]eading[Tt]est[Dd]ata`
Run Code Online (Sandbox Code Playgroud)

Ghoti 不同意,声称它是一个文件 glob。维基百科上的glob页面声称(强调我的):

Glob 不包括 Kleene 星的语法,它允许多次重复表达式的前一部分;因此它们不被视为正则表达式,它可以在任何给定的有限字母表上描述更大的正则语言集。

但是,没有引用此声明,表明这只是特定维基百科编辑的意见。

The Single UNIX® Specification, Version 2指出基本正则表达式 (BRE) 甚至可以是单个字符:

普通字符是与自身匹配的 BRE:支持的字符集中的任何字符,但 BRE 特殊字符中列出的 BRE 特殊字符除外。

那么,*nix 世界中正则表达式的定义是什么,该定义是否不包括文件 glob?

regular-expression

10
推荐指数
2
解决办法
1282
查看次数