Bash sed用另一种模式中存在的单词删除行

时间:2016-03-19 11:45:05

标签: bash awk sed

我有控制台输出,如:

SECTION/foo
SECTION/fo1
SECTION/fo3

Foo = N
Fo1 = N
Fo2 = N
Fo3 = N
Bar = Y

作为输出,我希望:

Foo = N
Fo1 = N
Fo3 = N

任何(简单)解决方案?

提前致谢!

4 个答案:

答案 0 :(得分:1)

Perl救援!

perl -ne ' $h{ ucfirst $1 } = 1 if m(SECTION/(.*));
           print if /(.*) = / && $h{$1};
         ' < input

从包含SECTION/的行创建哈希表。如果该行包含=并且其左侧存储在哈希中,则会打印它。

答案 1 :(得分:1)

使用awk即可:

awk -F' *[/=] *' '$1 == "SECTION" {a[tolower($2)]} tolower($1) in a' file

Foo = N
Fo1 = N
Fo3 = N

说明

  • 我们使用自定义字段分隔符将每一行拆分为' *[/=] *',这意味着/=每边包含0个或更多空格。
  • 当第一个字段为SECTION时,我们会将每个小写列2存储到数组a
  • 稍后当在数组a中找到小写第一列时,我们会打印每一行(默认操作)。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -nr '/SECTION/H;s/.*/&\n&/;G;s/\n.*/\L&/;/\n(.*) .*\n.*\/\1/P' file

收集保留空间(HS)中的所有SECTION行。双线并用换行符分隔。附加来自HS的收集行,并将从第一个换行到结尾的所有行转换为小写。使用反向引用将变量与截面后缀匹配,如果是,则仅打印第一行,即原始行未加粗。

N.B。 -n调用sed的类似grep的性质,-r减少了写正则表达式所需的反斜杠数。

答案 3 :(得分:0)

awk '$1 ~ /Foo|Fo1|Fo3/'  file 
Foo = N
Fo1 = N
Fo3 = N