使用 grep 打印列出的字符串之一,但如果存在多个字符串,则打印所有这些字符串

Using grep to print one of the listed strings but print all of them if more than one exists

我在一个文件中搜索了三个字符串。要找到其中任何一个的行,我使用

grep 'string1\|string2\|string3' file

我想使用 -o 标志仅打印出每一行中匹配的字符串。但在这种情况下,如果行中存在两个字符串,则只会显示其中一个。有没有一种方法可以得到类似 string1 and/or string2 等的东西,而不必列出 6 个使用和或使用 this answer.

的案例

请注意,我使用的是 OS X Yosemite。

预期输出:

string1
string1 string2
string3
string1 string3
string3

等等

你最后多了一个尾随\|,试试

grep -o 'string1\|string2\|string3' file
string1
string1
string2
string3
string1
string3
string3

编辑: 您可以将此 grep 与 gnu-awk 一起使用:

grep -no 'string1\|string2\|string3' file | awk -v RS='[0-9]+:' 'NR>1{
      gsub(/\n/, "\t"); print}'

你可以尝试打印行号,重复的记录 不会有行号。然后只需加入带有 post 处理的行。

grep -Eon 'string1|string2|string3' txt 

1:string1
2:string2
string3
3:string3
4:string1
string2

在上面的例子中 2:string2string3 可以合并形成 string2 string3

在 Mac OS

上完成命令
 grep -Eon 'string1|string2|string3' txt | tr  '\n' ' ' 
 | sed -E 's/ [0-9]:/:/g' | tr ':' '\n'

最后一个 tr & sed 命令可以替换为单个 sed 命令。但不知何故换行符在 Mac sed.

上不起作用

输出将类似于此

string1
string2 string3
string3
string1 string2 string3