linux shell:打印第一个单词与包含特殊字符的变量匹配的行

时间:2013-08-15 07:25:14

标签: linux grep tcsh

我有一个包含如下字符串行的文件:

uh-g+n uh-g+b
uh-g g
uh-g+r
g+n
uh-g+s g
sh-n+b
sh-n+d
n+d sh-n+d
g-n+d sh-n+d

我有一个我要搜索的字符串列表,例如

设置pats =(g + n sh -n + b n + d)

对于每个字符串,我想找到第一个“word”与字符串匹配的行,并将该行附加到另一个文件。

正如你所看到的......

  • 要匹配的字符串是变量

  • 字符串可能包含也可能不包含特殊的前导字符,例如“ - ”

  • 行可以包含字符串作为两个单词中的第一个,或者单独使用

  • 该字符串可以是包含特殊前导字符的较长字符串的子字符串

  • 字符串可能是第二个单词或第二个单词的一部分(不应该匹配)

找到与grep相关的正确组合来实现这项工作是一个意想不到的挑战!

这是一个简单易用的例子,它不起作用(假设上面列出的行在文件in.txt中。

#!/bin/tcsh

set pats = (g+n sh-n+b n+d)

foreach pat ($pats)

   grep -w $pat in.txt >> out.txt

end

在这种情况下,out.txt看起来像这样:

uh-g+n uh-g+b
g+n
sh-n+b
sh-n+d
n+d sh-n+d
g-n+d sh-n+d
uh-g+n uh-g+b
g+n
sh-n+b
sh-n+d
n+d sh-n+d
g-n+d sh-n+d

但我想要的是:

g+n
sh-n+b
n+d sh-n+d

1 个答案:

答案 0 :(得分:1)

以下管道给出了预期的输出:

( IFS=$'\n' ; echo "${pats[*]/#/^}" ) | grep -f- in.txt

第一部分只输出模式,每个模式在其行上并以^开头。 Grep然后搜索模式,^使它们在行的开头匹配。

更新:标记已更改为tcsh。哎哟。这是一个bash解决方案。