第n次出现正则表达式的sed打印行

时间:2013-10-15 20:49:49

标签: regex linux shell sed range

假设我们有以下数据

 B346879 length: 12 B34 L677
 B111879 length: 32 B33 L677
 B545879 length: 34 B34 L677
 B344879 length: 98 B33 L677
 B090879 length: 45 B33 L677

我正在寻找'B34'所以从这个系列我想要打印第1和第3行。 但如果我愿意的话:

cat t.txt | sed -n '/B34/p' | awk '{print $1", "$4" "$5}' | sed 's/B//g'

第4行也将被打印,因为'B34'匹配'B344879的前3个字符。我知道像sed 's/pattern/replacement/n'之类的东西你只能替换正则表达式的第n个出现。但它如何与印刷一起使用。我试过像sed -n '/B34/2p'这样的东西,但那是无效的。

4 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -rn 's/^\s*(\S+)\s+(\S+\s+){2}(B34)\s+(\S+)/\1, \3 \4/;T;s/B//g;p' file

答案 1 :(得分:1)

试试这一行:

awk '$4=="B34"' file

你的休息命令(sed,cat ...)可以合并到上面的单行中:

awk '$4=="B34"{gsub(/B/,"");print $1,$4,$5}' file

用你的例子测试它:

kent$  echo " B346879 length: 12 B34 L677
 B111879 length: 32 B33 L677
 B545879 length: 34 B34 L677
 B344879 length: 98 B33 L677
 B090879 length: 45 B33 L677"|awk '$4=="B34"{gsub(/B/,"");print $1,$4,$5}' 
346879 34 L677
545879 34 L677

修改

awk将空格设为FS,因此第3个字段的长度无关紧要,例如:

kent$  echo " B346879 length: 17777777777777777772 B34 L677                                                                                                                 
 B111879 length: 32 B33 L677
 B545879 length: 34 B34 L677
 B344879 length: 98 B33 L677
 B090879 length: 45 B33 L677"|awk '$4=="B34"{gsub(/B/,"");print $1,$4,$5}' 
346879 34 L677
545879 34 L677

修改

好的,看看你的意思,所以这应该有效:

awk -F'length:[ 0-9]*' '$2~/^B34/{sub(/B/,"",$1);sub(/B/,"",$2);print $1,$2}' 

见测试:第一行是特殊情况。

kent$  echo " B346879 length:212 B34 L677
 B111879 length: 32 B33 L677
 B545879 length: 34 B34 L677
 B344879 length: 98 B33 L677
 B090879 length: 45 B33 L677"|awk -F'length:[ 0-9]*' '$2~/^B34/{sub(/B/,"",$1);sub(/B/,"",$2);print $1,$2}'
 346879  34 L677
 545879  34 L677

答案 2 :(得分:1)

cat t.txt | awk '$4 == "B34" {print $1", "$4" "$5}'|sed s/B//g

答案 3 :(得分:1)

您可以在此处使用单词边界表示法\< ..\>

cat t.txt | sed -n '/\<B34\>/p' | awk '{print $1", "$4" "$5}' | sed 's/B//g'

输出

346879, 34 L677
545879, 34 L677

打印匹配的行。

sed -n '/\<B34\>/p' t.txt

输出

B346879 length: 12 B34 L677
B545879 length: 34 B34 L677