Bash 基于shell中的另一个文件筛选一个文件中的特定行

Bash 基于shell中的另一个文件筛选一个文件中的特定行,bash,awk,sed,grep,Bash,Awk,Sed,Grep,想象一下拥有这两个文件: 第一: # foo http://some.url/ # bar http://foo.url/ # bar http://and.one.more/url 第二: foo doo 现在,我想从第一个文件中打印出那些以第二个文件中的单词开头并包含这些单词的行,不仅是这些行,还有那些匹配行后面的URL 起初,我似乎可以使用grep: 但是,这当然是一个错误: # foo http://some.url/ -- http://foo.url/ # bar 所以,我的问

想象一下拥有这两个文件:

第一:

# foo
http://some.url/
# bar
http://foo.url/
# bar
http://and.one.more/url
第二:

foo
doo
现在,我想从第一个文件中打印出那些以第二个文件中的单词开头并包含这些单词的行,不仅是这些行,还有那些匹配行后面的URL

起初,我似乎可以使用grep:

但是,这当然是一个错误:

# foo
http://some.url/
--
http://foo.url/
# bar
所以,我的问题是,我如何将过滤限制为仅限于以开头的行?找到这些行后,打印出这些行,以及这些行之后的下一行。如果可以用一些标准工具,如grep、sed或awk来实现,那就太好了

这个例子的预期结果是:

# foo
http://some.url/

编辑:很抱歉打扰大家,对于我的特殊情况,我决定暂时连接行,然后先连接到grep-f Second,然后在打印出来时将结果行拆分回来。

您可以使用进程替换在文件中的每行前面加上^,附加$,并将其用作grep的-f参数

过程替代中的sed将起作用:

grep -A1 -Fwf <(sed 's/^/# /' second) first
# foo
http://some.url/

我能想到的最简单的方法是,首先在两个文件中都给自己一些标签

文件A:-

#----------+foo----------
# foo
http://some.url/
#----------.foo----------
文件B:-

#----------+foo----------
doo
#----------.foo----------
现在,您只需执行以下操作:-

#!/bin/sh

sed -n "/+foo/,/.foo/" filea.txt >> newfile.txt
sed -n "/+foo/,/.foo/" fileb.txt >> newfile.txt

cat > edpop+.txt << EOF
4,5d
wq
EOF

ed -s newfile.txt < edpop+.txt

一旦你把文本放在一个文件中,这将消除中间的两条带。

你在最新编辑中描述的内容我决定只是暂时连接行,然后grep-f Second First不可能起作用。它可能会从某个给定的输入集中产生您期望的输出,但它非常脆弱,因此在给定其他输入时会失败。@EdMorton您可能想到了一些场景?一些具体的陷阱?有很多种情况,但最明显的是在您的示例中,从第一行到第二行,共有两行。因为foo出现在URL中http://foo.url/,如果您将每一对行合并,然后grep,那么这两行将被打印,尽管以bar开头的行中没有foo。首先,通过组合这些行,使这一问题变得更难解决,因为现在需要区分URL与在原始行中匹配的字符串之间的字符串,然后用您所发布的GRIP也担心部分和/或ReXEP匹配模式在第二个可以被调整而不考虑URL。比如说,在开头加上“^”。这不是唯一的问题,再说一遍——你只是在不必要地增加工作难度,你在走错误的道路,采用了组合线的方法。你得到了几个答案,你说你想要的,你应该接受一个,如果,听起来,你有一个不同的问题,你张贴了一个新的问题,如果你想帮助它。
#----------+foo----------
doo
#----------.foo----------
#!/bin/sh

sed -n "/+foo/,/.foo/" filea.txt >> newfile.txt
sed -n "/+foo/,/.foo/" fileb.txt >> newfile.txt

cat > edpop+.txt << EOF
4,5d
wq
EOF

ed -s newfile.txt < edpop+.txt