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)
对于每个字符串,我希望找到第一个“单词”与字符串匹配的行,并将该行附加到另一个文件中
正如你所看到的
- 要匹配的字符串位于变量中
- 字符串可能包含也可能不包含特殊的前导字符,例如“-”
- 行可以包含字符串作为两个单词中的第一个,也可以单独包含
- 该字符串可以是包含特殊前导字符的较长字符串的子字符串
- 字符串可以是第二个单词或第二个单词的一部分(不应匹配)
#!/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。