在 sed 中提取以特定模式开头的行

在 sed 中提取以特定模式开头的行

我的输入文件是这样的:

IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

我使用 sed 来提取所有 IDno 和仅当类型为学生时的类型。

sed -e '/IDno=/b' -e '/Type=Student/b' d

这样我就得到了所有带有学生类型的行,但没有 IDnos。

我想得到

IDno="1"
Type=Student
IDno="2"

但我得到了

Type=Student

我究竟做错了什么?

答案1

使用sed,要打印特定行,更容易使用-n选项和p命令:

sed -rn '/IDno=|Type=Student/p'

或者:

sed -n -e '/IDno=/p' -e '/Type=Student/p'

-n选项会抑制输出,除非明确打印。p当然,该命令会打印匹配的行。

答案2

egrep可以从文件中获取多行。使用管道|作为分隔符,您可以提取任意数量的不同条件。 egrep相当于grep -Eegrep是在文件夹中找到的脚本/bin,其内容指向exec grep -E "$@"

例子:

egrep "IDno=|Type=Student" inputfile

或者

grep -E "IDno=|Type=Student" inputfile

应该输出:

IDno="1"
Type=Student
IDno="2"

希望这可以帮助!

答案3

  • awk

    将字段分隔符设置为,并打印包含作为整个记录或作为第一个字段的=记录:Type=StudentIDno

    awk -F= '$1=="IDno" || $0=="Type=Student"'
    
  • perl

    IDno打印以 开头,后跟=,或以 开头Type,后跟=并以 结尾的行Student

    perl -ne 'print if /^(IDno=|Type=Student$)/'
    

例子:

% cat file.txt                                  
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"

% perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"

答案4

最初的问题似乎是问“提取所有 IDno 和类型仅当类型为学生时。但是示例输出返回所有 IDno= 行,因此这相当矛盾......

这是一个答案,当 Type=Student 时仅返回 IDno 和 Type。

sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="

稍微解释一下:

  • -n, --quiet, --silent 禁止自动打印模式空间
  • N;N;将下一行输入读取/附加到模式空间。(两次)
  • /IDno=.*Type=Student/p查找并打印从 IDno= 到 Type=Student
  • | grep -v "^Name="不显示 Name= 行

我不喜欢 sed|grep,但不太清楚如何让 sed 重新搜索它的输出,而管道通常表示“获取此输出并执行某些操作”……也可以使用 grep|sed

grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'

相关内容