Regex sed无法识别括号后的制表符

Regex sed无法识别括号后的制表符,regex,bash,sed,Regex,Bash,Sed,我有一个文件,每行有两列,每列用制表符分隔: foo1 foo2 foo3() foo4 我想用新行替换每个选项卡(,但仅替换那些不是新行第一个字符的选项卡)。因此,最终我会得出以下结论: foo1 foo2 foo3() foo4 perl -p -e "s/(?<=\S)\t/\n/g" 我使用sed的方式如下: sed "s/\b\t/\n/g" 除非选项卡前面有)字符(以及其他类似+=/\的字符,否则它工作正常。因此,在本例中,我得到: foo1 foo2 foo3

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

foo1    foo2
foo3()  foo4
我想用新行替换每个选项卡(,但仅替换那些不是新行第一个字符的选项卡)。因此,最终我会得出以下结论:

foo1
foo2
foo3()
foo4
perl -p -e "s/(?<=\S)\t/\n/g"
我使用sed的方式如下:

sed "s/\b\t/\n/g"
除非选项卡前面有
字符(以及其他类似
+=/\
的字符,否则它工作正常。因此,在本例中,我得到:

foo1
foo2
foo3()  foo4
如何使sed即使位于括号之后也能识别选项卡

编辑:

Linux 4.4.0-47-generic#68 Ubuntu SMP

sed(GNU-sed)4.2.2

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


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

sed "s/\(^.*\)\t/\1\n/g"
搜索最大的子字符串直到行上的最后一个制表符,并在其后添加一个换行符,删除该制表符。

与多行
m
标志一起使用,然后替换为新行
\n

(?<!^)\t

感谢大家在这项任务中的投入。我发现
perl
在这种情况下效果更好。因此,最后我得出以下结论:

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

perl-p-e“s/(?这不会也替换一行中第一个字符的制表符吗?sed不支持lookarounds@Ibrahim,我认为Sundeep是对的。sed中有些东西……也许awk更适合这个目的?@JacobS是的,他是对的。我更新了我的答案。awk似乎是一个不错的选择。sed不支持环顾四周Sam我猜对了您只想将两列输入文件转换为单列吗?您可以尝试使用类似以下命令:
grep-o'[^\t]*'file
xargs
awk'{print$1或$2}'file
等请将
uname-srv&&sed--version
的输出添加到您的Q中。祝您好运。另外,请提醒我,
\b
代表什么?您不能只做
\t
以确保它不是行中的第一个字符吗?祝您好运。@Sheller,我添加了os和sed版本。不幸的是
\t
也吃第一个字符前一个单词中的字母。@Sundeep,你说的命令不起作用,因为我在制表符后面有很长的字符串-有空格,有时是一个,有时是两个谢谢你的回复,这一个确实抓住了括号后面的制表符,但它也替换了行开头的制表符