-1

我有一个包含这样的字符串行的文件:

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)

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

如你看到的...

  • 要匹配的字符串在变量中

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

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

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

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

找到与 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
4

1 回答 1

1

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

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

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

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

于 2013-08-15T09:30:44.577 回答