我有一个文件,每行有两列,每列用一个制表符分隔:
foo1 foo2
foo3() foo4
我想用新行替换每个标签(但只有那些不是新行中的第一个字符的标签)。所以最后我最终得到:
foo1
foo2
foo3()
foo4
我像这样使用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
答案 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"
再次感谢!