sed不会在圆括号后识别制表符

时间:2016-11-13 21:39:45

标签: regex bash sed

我有一个文件,每行有两列,每列用一个制表符分隔:

foo1    foo2
foo3()  foo4

我想用新行替换每个标签(但只有那些不是新行中的第一个字符的标签)。所以最后我最终得到:

foo1
foo2
foo3()
foo4

我像这样使用sed:

sed "s/\b\t/\n/g"

除非在标签之前有)字符(以及+ = / \之类的其他字符),否则效果很好。所以在这种情况下,我得到:

foo1
foo2
foo3()  foo4

如何制作sed,即使它位于括号后面,它也能识别标签?

regex101

修改

Linux 4.4.0-47-generic#68-Ubuntu SMP

sed(GNU sed)4.2.2

4 个答案:

答案 0 :(得分:1)

假设文件中只有两列(第二列不包含标签),您也可以尝试这样做:

sed "s/\(^.*\)\t/\1\n/g"

搜索最大子字符串,直到某行的最后一个标签,并在其后添加换行符,删除该标签。

答案 1 :(得分:0)

圆括号()不是单词边界的一部分。 1

尝试这样做:(?<=\S)\t

sed "s/(?<=\S)\t/\n/g"

演示:https://regex101.com/r/xC7qJ2/12

<强>更新

  

正如@Sundeep所指出的,Sed似乎不支持Lookarounds。

答案 2 :(得分:0)

this regex与多行m标记一起使用,然后替换换行\n

(?<!^)\t

它用新行字符替换不在行开头(^)之前的每个制表符。 m标记允许^$分别匹配行的开头和结尾。请注意,这也适用于由一个选项卡分隔的任意数量的列。

使用此命令进行替换:

sed -e 's/(?<!^)\t/\n/gm'

答案 3 :(得分:0)

感谢大家对此任务的投入。我发现perl在这种情况下效果更好。所以最后我最终得到了:

perl -p -e "s/(?<=\S)\t/\n/g"

再次感谢!