标签: regular-expression

如何跨多行“grep”模式?

看来我在滥用grep/ egrep

我试图在多行中搜索字符串,但找不到匹配项,而我知道我要查找的内容应该匹配。最初我认为我的正则表达式是错误的,但我最终读到这些工具是按行运行的(而且我的正则表达式是如此微不足道,这不可能是问题)。

那么,应该使用哪种工具来跨多行搜索模式呢?

grep search regular-expression file-search

45
推荐指数
6
解决办法
12万
查看次数

GNU 或 BSD Sed 中的正则表达式交替/或运算符 (foo|bar)

我似乎无法让它发挥作用。GNU sed 文档说要转义管道,但这不起作用,也不能使用没有转义的直管。添加括号没有区别。

$ echo 'cat
dog
pear
banana
cat
dog' | sed 's/cat|dog/Bear/g'
cat
dog
pear
banana
cat
dog

$ echo 'cat
dog
pear
banana
cat
dog' | sed 's/cat\|dog/Bear/g'
cat
dog
pear
banana
cat
dog
Run Code Online (Sandbox Code Playgroud)

shell sed regular-expression

44
推荐指数
3
解决办法
7万
查看次数

grep 并转义美元符号

我想知道哪些文件有 string $Id$

grep \$Id\$  my_dir/mylist_of_files
Run Code Online (Sandbox Code Playgroud)

返回 0 次出现。

我发现我必须使用

grep \$Id$ my_dir/mylist_of_files

然后我看到$Id输出中的是彩色的,即它已匹配。

我怎么能匹配第二个$,为什么不起作用\$Id\$

第二个$是否是最后一个字符并不重要。

我用grep2.9。


在发布我的问题之前,我使用了谷歌......

我找到了答案

要在名为 test2 的文件中搜索 $(美元符号),请输入:

grep \\$ test2

\\(双反斜杠)字符是强制shell 将\$(单反斜杠,美元符号)传递给grep 命令所必需的。\(单反斜杠)字符告诉 grep 命令将后面的字符(在本例中为 $)视为文字字符而不是表达式字符。使用 fgrep 命令可以避免使用转义字符(如反斜杠)的必要性。

但我不明白为什么grep \$Id有效,为什么grep \\$Id\\$无效。

我有点困惑...

shell grep quoting regular-expression

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

与 SED 正则表达式的非贪婪匹配(模拟 perl 的 .*?)

我想用sed在第一之间的字符串替换任何AB第一的发生AC(含)用XXX

对于例如,我有这样的字符串(该字符串是仅用于测试):

ssABteAstACABnnACss
Run Code Online (Sandbox Code Playgroud)

我想类似这样的输出:ssXXXABnnACss


我这样做了perl

$ echo 'ssABteAstACABnnACss' | perl -pe 's/AB.*?AC/XXX/'
ssXXXABnnACss
Run Code Online (Sandbox Code Playgroud)

但我想用sed. 以下(使用 Perl 兼容的正则表达式)不起作用:

$ echo 'ssABteAstACABnnACss' | sed -re 's/AB.*?AC/XXX/'
ssXXXss
Run Code Online (Sandbox Code Playgroud)

sed text-processing regular-expression

37
推荐指数
4
解决办法
3万
查看次数

使用带有 --exclude-dir 标志的 grep 来排除多个目录

我在 Ruby on Rails 应用程序中搜索grep在 OSX 上使用的单词,我想排除匹配特定模式的目录。

我正在使用以下命令:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'
Run Code Online (Sandbox Code Playgroud)

这个命令没有做我认为它会做的事情。这是我认为它会起作用的方式:

  • i - 不区分大小写的搜索
  • n - 打印找到模式的行号
  • R - 递归搜索
  • w - 我只想要整个单词 - 即匹配“direct”而不是“directory”
  • -E - 使用扩展正则表达式
  • 'direct' - 我想匹配的正则表达式
  • . - 在当前目录中搜索
  • --exclude-dir -E 'git|log|asset' - 排除匹配 git 或日志或资产的目录。

在排除目录方面,该命令最终仍会在“./git”“./log”目录以及“./app/assets”中搜索

我显然缺乏基本的知识,但我不知道它是什么。

grep regular-expression

36
推荐指数
3
解决办法
5万
查看次数

Bash 正则表达式捕获组

我正在尝试从一个字符串中匹配多个字母数字值(这个数字可能会有所不同),并将它们保存到一个 bash 捕获组数组中。但是,我只得到第一场比赛:

mystring1='<link rel="self" href="/api/clouds/1/instances/1BBBBBB"/> dsf <link rel="self" href="/api/clouds/1/instances/2AAAAAAA"/>'

regex='/instances/([A-Z0-9]+)'

[[ $mystring1 =~ $regex ]]

echo ${BASH_REMATCH[1]}
1BBBBBB

echo ${BASH_REMATCH[2]}
Run Code Online (Sandbox Code Playgroud)

如您所见 - 它与我正在寻找的第一个值匹配,但与第二个值不匹配。

bash regular-expression

35
推荐指数
2
解决办法
6万
查看次数

必须有更好的方法来仅替换单个换行符吗?

我习惯于每句话写一行,因为我通常将内容编译为 LaTeX,或者以其他格式编写,其中换行符会被忽略。我使用一个空行来表示一个新段落的开始。

现在,我有一个以这种风格编写的文件,我只想将其作为纯文本发送。我想删除所有单换行符,但保持双换行符完好无损。这就是我所做的:

sed 's/^$/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Run Code Online (Sandbox Code Playgroud)

这将用我确信不会出现在文件中的一些文本替换空行:NEWLINE然后它摆脱了所有换行符awk(我在某个网站上发现了这个技巧),然后NEWLINE用必要的两个换行符替换了s。

这似乎是做一件非常简单的事情的冗长方法。有没有更简单的方法?此外,如果有一种方法可以用单个空格替换多个空格(有时出于某种原因会出现),那也很好。

我使用 emacs,所以如果有一些 emacs 特定的技巧是好的,但我宁愿看到一个纯粹的sed或纯粹的awk版本。

sed awk text-processing regular-expression

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

什么是 .gitignore 模式等价于正则表达式 (Big|Small)(State|City)-[0-9]*\.csv

我有一个.gitignore类似于以下内容的正则表达式:

(Big|Small)(State|City)-[0-9]*\.csv
Run Code Online (Sandbox Code Playgroud)

它不起作用,所以我针对RegexLab.NET对其进行了测试。

然后我找到了gitignore手册页,这让我了解到 gitignore 不使用正则表达式,而是使用fnmatch(3)

但是, fnmatch 它似乎没有与捕获组等效的内容。这是可行的还是我需要把它分成三行?

git regular-expression wildcards patterns

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

Grep 单词边界

根据 GNU 文档:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.
Run Code Online (Sandbox Code Playgroud)

我的 /etc/fstab 看起来像这样:

/dev/sdb1       /media/fresh      ext2   defaults     0 0
Run Code Online (Sandbox Code Playgroud)

我希望 grep 为 /media/fresh 的存在返回 TRUE/FALSE。我尝试使用\<\>但没有用。为什么?

egrep '\</media/fresh\>' /etc/fstab
Run Code Online (Sandbox Code Playgroud)

解决方法:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab
Run Code Online (Sandbox Code Playgroud)

但它看起来更丑。

我的 grep 是 2.5.1

grep regular-expression

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

如何在包括它们在内的两个模式之间选择第一次出现

如何在包括它们在内的两个模式之间选择第一次出现。最好使用sedawk

我有:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Run Code Online (Sandbox Code Playgroud)

我想要第一次出现 P1 和 P2 之间的线(包括 P1 线和 P2 线):

something P1 something
content1
content2
something P2 something
Run Code Online (Sandbox Code Playgroud)

sed awk regular-expression

31
推荐指数
3
解决办法
3万
查看次数