Questions tagged «regular-expression»

正则表达式是匹配字符串中字符模式的一种方式。


8
grep只能输出匹配的指定分组吗?
说我有一个文件: # file: 'test.txt' foobar bash 1 bash foobar happy foobar 我只想知道“ foobar”之后出现的单词,因此可以使用此正则表达式: "foobar \(\w\+\)" 括号表示我对foobar之后的单词有特别的兴趣。但是当我执行a时grep "foobar \(\w\+\)" test.txt,我得到的行与整个正则表达式匹配,而不仅仅是“ foobar之后的单词”: foobar bash 1 foobar happy 我更希望该命令的输出如下所示: bash happy 有没有办法告诉grep仅在正则表达式中输出与分组(或特定分组)匹配的项目?


14
如何使用sed替换多行字符串?
我注意到,如果我添加\n了一个模式以替换使用sed,则该模式不匹配。例: $ cat > alpha.txt This is a test Please do not be alarmed $ sed -i'.original' 's/a test\nPlease do not/not a test\nBe/' alpha.txt $ diff alpha.txt{,.original} $ # No differences printed out 我该如何工作?


8
如何使用多个AND模式运行grep?
我想在模式之间使用隐式AND进行多模式匹配,即等效于在序列中运行多个抓取: grep pattern1 | grep pattern2 | ... 那么如何将其转换为类似的东西呢? grep pattern1 & pattern2 & pattern3 我想使用单个grep,因为我正在动态构建参数,因此所有内容都必须放在一个字符串中。使用filter是系统功能,而不是grep,因此不是它的参数。 请勿将此问题与以下内容混淆: grep "pattern1\|pattern2\|..." 这是一个OR多模式匹配。

7
使用sed查找并替换复杂的字符串(最好使用正则表达式)
我有一个包含以下内容的文件: <username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname> 并且我需要制作一个脚本,将第一行中的“名称”更改为“ something”,第二行中的“密码”更改为“ somethingelse”,第三行中的“ name”更改为“ somethingdifferent”。我不能依靠它们在文件中出现的顺序,因此我不能简单地将“名称”的第一次出现替换为“某物”,并将第二次出现的“名称”替换为“某物”。我实际上需要搜索周围的字符串,以确保找到并替换了正确的东西。 到目前为止,我已经尝试过以下命令来查找和替换第一个“名称”出现的位置: sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml 但是它不起作用,所以我认为其中某些字符可能需要转义,等等。 理想情况下,我希望能够使用正则表达式来匹配两个“用户名”的出现并仅替换“名称”。像这样的东西,但是sed: <username>.+?(name).+?</username> 并用“ something”代替括号中的内容。 这可能吗?



2
Grep'OR'正则表达式问题
我正在尝试使用带有正则表达式的grep在文件中查找与2个可能的字符串之一匹配的行。这是我的grep: $ grep "^ID.*(ETS|FBS)" my_file.txt 上面的grep不返回结果。但是,如果我执行以下任一操作: $ grep "^ID.*ETS" my_file.txt 要么 $ grep "^ID.*FBS" my_file.txt 我确实匹配特定的行。为什么我的OR正则表达式不匹配?先谢谢您的帮助!

5
如何区分忽略注释的文件(以#开头的行)?
我有两个配置文件,一个是来自软件包管理器的原始文件,另一个是我自己修改的自定义文件。我添加了一些注释来描述行为。 如何diff在配置文件上运行而跳过注释?带注释的行由以下方式定义: 可选的前导空格(制表符和空格) 井号(#) 其他任何字符 跳过第一个要求的(最简单)正则表达式将是#.*。我尝试了GNU diff 3.0 的--ignore-matching-lines=RE(-I RE)选项,但无法在RE中使用它。我也尝试过.*#.*,.*\#.*没有运气。从字面上看,将(Port 631)放在RE任何地方都不匹配,将RE放在斜线之间也无济于事。 如“ diff”工具中所建议的那样,似乎缺少正则表达式?,我尝试过grep -G: grep -G '#.*' file 这似乎与注释匹配,但不适用于diff -I '#.*' file1 file2。 那么,该选项应如何使用?如何diff跳过某些行(在我的情况下为评论)?请不要建议grep文件和比较临时文件。


7
查找多个文件夹名称中的文件
我想列出所有从文件dir1,dir2,dir3并dir4可能作为我的一个子目录在任何地方cwd使用的find命令。我尝试了以下操作,但均未成功: find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+' 我也尝试posix-extended过。如何列出这些文件?

9
标签的简单sed更换神秘失败
这应该真的很简单,但是由于某些原因它不起作用: sed -i.bak -E 's/\t/ /' file.txt 不是替换制表符,而是替换t字符。我已经尝试了所有可以想到的变体,使用引号等。我用Google搜索,发现其他所有人都使用非常相似的表达式,它们似乎很适合他们。 这-E是OS X的东西。我以为失败可能是OS X的一些怪异的结果sed,所以我也使用Ruby进行了尝试(不带-i),并且得到了相同的结果: ruby -pe '$_.gsub!(/\t/," ")' < file.txt > file.new 我在OS X和iTerm上使用的是Bash 3.2.51,尽管我看不到其中任何一个都非常相关。我没有设置任何奇怪的环境变量,尽管我可以发布您认为可能相关的任何变量。 有什么事吗 更新:我在尝试Ruby版本时肯定犯了其他错误或错字,因为Gilles指出它确实有效(而且我从来没有让他把我弄错!)。我不确定发生了什么,但是我很确定那一定是我的错误。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.