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

linux shell:打印第一个单词与包含特殊字符的变量匹配的行,linux,grep,tcsh,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 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 我有一个正在搜索的字符串列表,例如 设置pats=(g+n sh-n+b n+d

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

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
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
我有一个正在搜索的字符串列表,例如

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

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

正如你所看到的

  • 要匹配的字符串位于变量中

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

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

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

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

这是一个意想不到的挑战,找到与grep一起工作的正确组合来实现这一目标

下面是一个简单但不起作用的示例(假设上面列出的行在file 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
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
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

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

( IFS=$'\n' ; echo "${pats[*]/#/^}" ) | grep -f- in.txt
第一部分只是输出模式,每个模式在其行上,前面有
^
。Grep然后搜索模式,
^
使它们在行的开头匹配


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

您好,欢迎使用Stack Overflow!当问题询问代码时,我们希望它包括尝试的解决方案,为什么它们不起作用,以及您想要的结果。(请参阅。)更具体地说,对于你的问题,我还需要一个比“shell”更具体的标签,因为您用于设置字符串列表的符号与普通Linux shell的符号不匹配。您似乎有不止一个要使用的模式。您到底想匹配什么。是否要分别匹配每个模式?所需结果的示例将有助于阐明您的观点。另外,请描述您希望使用的方法我已经试过了(例如grep开关和报价)。非常感谢-我从你的例子中学到了一些东西。我不知道IFS。