仅在sed中匹配行号时打印特定行号

4

如果在Linux流编辑器sed中有匹配项,如何仅打印(特定的)行?假设我有第三行,只有它符合匹配条件时才想要打印输出;我应该如何打印输出这一行?

我正在将一个命令的输出导入到sed中,并且不希望再次使用sed的输出进行导入:

| sed -ne ''"$currline"'p' | sed -n '/state/p'`

另外,我使用反引号将输出分配给一个变量。


给定输入A和B以及搜索模式state,A的输出应为行3 stateless(请注意,3是数据的一部分),而B的输出应为空:

Input A              Input B
1 state              1 state
2 statement          2 statement
3 stateless          3 statless
4 stated             4 stated
5 estate             5 estate

2
有什么反对使用 grep 的吗? - jaudette
3
I can certainly help you with that. Please provide the English text that you want me to translate to Chinese. - Karoly Horvath
你想要输出行还是行号?对我来说不太清楚。 - Gilles Quénot
5个回答

6
sed -n '3{/state/p;}' $file

第3行匹配第3行;第3行的操作是“如果找到/state/,则打印”;-n防止一般性地打印行。

此外,您应该避免使用反引号;最好使用var=$(cmd1 | cmd2)符号而不是var=`cmd1 | cmd2`符号。


太棒了,我就是在找这个。非常感谢您的回答,希望楼主能选择您的答案。 - C2H5OH

3

我理解您想要匹配两个条件,一个是特定的行号,另一个是模式。您可以在一个sed命令中实现它。

假设infile的内容为:

one
two
three
four
five

如果您想打印第四行是否匹配 ur,请使用以下代码:

sed -ne '4 { /ur/ { p; q } }' infile

这将产生:

four

2

sed是一个优秀的工具,用于单行简单替换,但对于其他任何操作,请使用awk:

awk 'NR==3 && /state/'

2
使用
awk 'NR==3 && /pattern/{print;exit}'

注意:
  • pattern 是一个正则表达式 (regex)
  • exit 可以避免解析整个文件

1
这可能适用于您(GNU sed):
sed '3!d;/state/q;Q' file

或者

sed -ne '3!b' -e '/state/p' -e 'q' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接