如何正则表达式只匹配包含精确计数标签的行?

时间:2018-03-14 15:35:50

标签: regex sed

使用sed如何仅匹配包含两个标签的确切数量的行,以便移除他们的\n

实施例

仅删除第1行和第3行中的\n

输入:

foo \t bar \t foo
foo \t bar foo
foo \t bar \t foo
foo \t bar \t foo \t bar

预期输出:

foo \t bar \t foofoo \t bar foo
foo \t bar \t foofoo \t bar \t foo \t bar

我在Vim中尝试了这个正则表达式,但它也与第4行匹配:/\v\t.*\t.*

4 个答案:

答案 0 :(得分:1)

我使用awk:如果该行有3个以制表符分隔的字段,则打印不带换行符的行

awk -F'\t' '{printf "%s%s", $0, (NF==3 ? "" : ORS)}' file

但是,如果 next 行也有3个字段,它将与以下行连接。你的问题不清楚这个边缘情况。如果你只想加入,那么

awk -F'\t' 'NF==3 {line = $0; getline; $0 = line $0} 1' file

这两个命令与您的样本输入产生相同的输出。

答案 1 :(得分:0)

sed '/^[^\t]*\t[^\t]*\t[^\t]*$/N;s/\n//'

说明:

  • /^[^\t]*\t[^\t]*\t[^\t]*$/匹配一行,上面只有2个制表符
  • N在输入缓冲区
  • 后附加一行
  • s/\n//删除输入缓冲区中现在两行之间的换行符

答案 2 :(得分:0)

Perl救援:

OneToMany
  • perl -pe 'chomp if 2 == tr/\t//' < input > output 逐行读取输入行
  • chomp删除了最终换行符
  • -p是与tr///类似的音译运算符,它返回匹配字符的数量

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed ':a;s/\t/&/3;t;s//&/2;T;N;s/\n//;ta' file

匹配3个或更多标签,突破。匹配1个或更少的标签,爆发。匹配2个选项卡,追加下一行并删除两行之间的换行符,然后转到开始检查2个选项卡。