看来我在滥用grep/ egrep。
我试图在多行中搜索字符串,但找不到匹配项,而我知道我要查找的内容应该匹配。最初我认为我的正则表达式是错误的,但我最终读到这些工具是按行运行的(而且我的正则表达式是如此微不足道,这不可能是问题)。
那么,应该使用哪种工具来跨多行搜索模式呢?
我似乎无法让它发挥作用。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) 我想知道哪些文件有 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\\$无效。
我有点困惑...
我想用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) 我在 Ruby on Rails 应用程序中搜索grep在 OSX 上使用的单词,我想排除匹配特定模式的目录。
我正在使用以下命令:
grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'
Run Code Online (Sandbox Code Playgroud)
这个命令没有做我认为它会做的事情。这是我认为它会起作用的方式:
在排除目录方面,该命令最终仍会在“./git”和“./log”目录以及“./app/assets”中搜索
我显然缺乏基本的知识,但我不知道它是什么。
我正在尝试从一个字符串中匹配多个字母数字值(这个数字可能会有所不同),并将它们保存到一个 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)
如您所见 - 它与我正在寻找的第一个值匹配,但与第二个值不匹配。
我习惯于每句话写一行,因为我通常将内容编译为 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版本。
我有一个.gitignore类似于以下内容的正则表达式:
(Big|Small)(State|City)-[0-9]*\.csv
Run Code Online (Sandbox Code Playgroud)
它不起作用,所以我针对RegexLab.NET对其进行了测试。
然后我找到了gitignore手册页,这让我了解到 gitignore 不使用正则表达式,而是使用fnmatch(3)。
但是, fnmatch 它似乎没有与捕获组等效的内容。这是可行的还是我需要把它分成三行?
根据 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
如何在包括它们在内的两个模式之间选择第一次出现。最好使用sed或awk。
我有:
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)