复制与正则表达式匹配的文本

时间:2011-12-23 22:31:47

标签: regex visual-studio notepad++

我有一个正则表达式,在文本文件中有几个匹配项。 我想只将匹配复制到第二个文件。我不想复制包含匹配项的行:我只想要匹配的文本。

我在notepad ++中找不到这样做的方法(只复制完整的行,而不仅仅是匹配)。也不在Visual Studio搜索中。

有没有办法只复制匹配?也许在grepp或sed?

2 个答案:

答案 0 :(得分:8)

你可以用两者来做。假设我有一个以下文件 -

示例文件:

[jaypal:~/Temp] cat myfile 
this is some random number 424-555
and my cell is 111-222-3333
and 42555 is my zip code

我想从 only numbers

中捕获 myfile

使用sed

使用sed,您可以结合使用-np选项以及grouped pattern

sed -n 's/.[^0-9]*\([0-9-]\+\).*/\1/p'
   |   |          |          |  |  ||
    ---            ----------    -- |
     |                  |        |  ---------> `p` prints only matched output. Since
     V                  V        V              we are suppressing everything with -n
 Suppress       Escaped `(`      \1 prints      we use p to invoke printing.
 output        start the group   first matched   
               you can reference  group
               it with \1. If you
               have more grouped
               pattern then they can
               be called with \2 ...

测试:

[jaypal:~/Temp] sed -n 's/.[^0-9]*\([0-9-]\+\).*/\1/p' myfile 
424-555
111-222-3333
42555

您只需将其重定向到另一个文件即可。

使用grep

您可以使用 -

egrep -o "regex" filename

grep -E -o "regex" filename

来自手册页:

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (see below).

-o, --only-matching
    Show only the part of a matching line that matches PATTERN.

测试:

[jaypal:~/Temp] egrep -o "[0-9-]+" myfile
424-555
111-222-3333
42555

您只需将其重定向到另一个文件即可。

注意:显然这些都是简单的例子,但它传达了这一点。

答案 1 :(得分:0)

这可能对您有用:

sed -n 's/^.*\(matched text regexp\).*/\1/w matched_text_file' source_file