使用sed从文件中选择特定项

使用sed从文件中选择特定项,sed,Sed,谈到sed命令,我的Bruce Barnett向导就坐在我旁边,但有一件事一直困扰着我。对于文件,您是否可以使用sed对其进行过滤,以仅选择特定项目?例如,在以下文件中: alpha|november bravo|october charlie|papa alpha|quebec bravo|romeo charlie|sahara 是否可以设置一个仅返回bravos的命令,如: bravo|october bravo|romeo

谈到
sed
命令,我的
Bruce Barnett
向导就坐在我旁边,但有一件事一直困扰着我。对于文件,您是否可以使用
sed
对其进行过滤,以仅选择特定项目?例如,在以下文件中:

    alpha|november
    bravo|october
    charlie|papa
    alpha|quebec
    bravo|romeo
    charlie|sahara
是否可以设置一个仅返回
bravo
s的命令,如:

    bravo|october
    bravo|romeo
对于sed:

sed '/^bravo|/!d' filename
或者,使用grep(因为它是为这种东西设计的):

或者使用awk,它可以很好地处理表格数据

awk -F '|' '$1 == "bravo"' filename
前两个使用正则表达式,选择与之匹配的行。在
^bravo |
中,
^
匹配行首和
bravo |
文本字符串
bravo |
,因此选择以
bravo |
开头的所有行

awk方式通过字段分隔符
|
拆分行,并选择第一个字段为
bravo
的行

您还可以将正则表达式与awk一起使用:

awk '/^bravo|/' filename
…但我认为在这种情况下,这并没有发挥awk的优势。

对于sed:

sed '/^bravo|/!d' filename
或者,使用grep(因为它是为这种东西设计的):

或者使用awk,它可以很好地处理表格数据

awk -F '|' '$1 == "bravo"' filename
前两个使用正则表达式,选择与之匹配的行。在
^bravo |
中,
^
匹配行首和
bravo |
文本字符串
bravo |
,因此选择以
bravo |
开头的所有行

awk方式通过字段分隔符
|
拆分行,并选择第一个字段为
bravo
的行

您还可以将正则表达式与awk一起使用:

awk '/^bravo|/' filename

…但我不认为这会发挥awk在这种情况下的优势。

另一个使用
sed的解决方案:

sed -n '/^bravo|/p' filename
-n
选项=>默认情况下不打印。
如果行以
bravo |
开头,则将其打印(
p

另一个带有
sed的解决方案:

sed -n '/^bravo|/p' filename
-n
选项=>默认情况下不打印。 如果行以
bravo |
开头,则使用sed以两种方式(至少)打印(
p

删除不需要的线路

sed '/^bravo\|/ !d' YourFile
只打印想要的行

sed -n '/^bravo\|/ p' YourFile
  • 如果没有其他约束或操作发生,则两者都是相同的,grep更好
  • 如果之后会有一些操作,它可能会改变性能,其中
    d
    直接循环到下一行,并且将打印
    p
    ,然后继续执行以下操作。
    • 注意,GNU-sed需要管道的逸出,而不是posix版本
2路(至少)带sed

删除不需要的线路

sed '/^bravo\|/ !d' YourFile
只打印想要的行

sed -n '/^bravo\|/ p' YourFile
  • 如果没有其他约束或操作发生,则两者都是相同的,grep更好
  • 如果之后会有一些操作,它可能会改变性能,其中
    d
    直接循环到下一行,并且将打印
    p
    ,然后继续执行以下操作。
    • 注意,GNU-sed需要管道的逸出,而不是posix版本

哦,我还以为你第一次用的是
sed-n'/bravo/p'
。。这就是为什么我给出了我的答案,希望有一个替代方案。我忽略了。。。你首先,+1:)@hek2mgl我一开始在sed解决方案中有一个输入错误,没有立即看到它;我知道sed和awk都很强大,但我对sed已经够麻烦了!不过谢谢,信息总是很受欢迎的。带管道的grep也不会返回空行或出现问题(在我的aix上不会返回任何内容)?@NeronLeVelu否。如果
被转义,它会的,就像在sed中一样(或者如果使用
egrep
,就像在
sed
中使用扩展的regex语法)。哦,我还以为你第一次使用了sed-n'/bravo/p'
。。这就是为什么我给出了我的答案,希望有一个替代方案。我忽略了。。。你首先,+1:)@hek2mgl我一开始在sed解决方案中有一个输入错误,没有立即看到它;我知道sed和awk都很强大,但我对sed已经够麻烦了!尽管如此,还是要感谢大家。带管道的grep也不会返回空行或出现问题(在我的aix上不会返回任何内容)?@NeronLeVelu No。如果
被转义,就像在sed中一样(或者如果您使用
egrep
,就像在
sed
中使用扩展的regex语法一样)。简单明了-谢谢!哦,谢谢你也整理了我的问题!!简单明了-谢谢!哦,谢谢你也整理了我的问题!!