在TSV匹配之前/之后插入换行符

时间:2018-02-03 21:54:07

标签: regex bash perl awk sed

我试着弄清楚如何完成一些正则表达式匹配以插入新行。下面的示例输入/输出......

示例TSV数据:

Name    Monitoring  Tags
i-RBwPyvq8wPbUhn495 enabled "some:tags:with:colons=some:value:with:colons-and-dashes/and/slashes/yay606-values-001  some:other:tag:with-colons-and-hypens=MACHINE NAME  Name=NAMETAG    backup=true"
i-sMEwh2MXj3q47yWWP enabled "description=RANDOM BUSINESS INT01  backup=true Name=SOMENAME"

期望的输出:

Name    Monitoring  Tags
i-RBwPyvq8wPbUhn495 enabled "some:tags:with:colons=some:value:with:colons-and-dashes/and/slashes/yay606-values-001
some:other:tag:with-colons-and-hyphens=MACHINE NAME 
Name=NAMETAG    
backup=true"
i-sMEwh2MXj3q47yWWP enabled "description=RANDOM BUSINESS INT01  
backup=true 
Name=SOMENAME"

我可以保证这些引号中的每个key=value都由硬/文字标签分隔,尽管它可能看起来不像StackOverflow代码块如何以HTML格式显示在代码块编辑器中,列Tags下的数据是引号,因此即使它们是制表符分隔符,它们也会保留在Tags列中。无论出于何种原因,我都无法成功获得理想的结果。

在我的尝试中,我基本上已经捕获""之间的所有内容,好像我的正则表达式搜索中的标签没有分开,因为我使用了通配符[TAB].*=.*[TAB]显然不工作,因为那时我在每一行的第一次/最后一次出现之间丢失了所有东西。我试图将它们存储在捕获组中而没有任何成功。

我正在寻找unix工具集解决方案(sed,awk,perl等)。任何/所有帮助表示赞赏!

4 个答案:

答案 0 :(得分:2)

这将在任何UNIX盒子上的任何shell中使用任何awk:

$ awk 'match($0,/".*"/){str=substr($0,RSTART,RLENGTH); gsub(/\t/,"\n",str); $0=substr($0,1,RSTART-1) str substr($0,RSTART+RLENGTH)} 1' file
Name    Monitoring      Tags
i-RBwPyvq8wPbUhn495 enabled "some:tags:with:colons=some:value:with:colons-and-dashes/and/slashes/yay606-values-001
some:other:tag:with-colons-and-hypens=MACHINE NAME
Name=NAMETAG
backup=true"
i-sMEwh2MXj3q47yWWP enabled "description=RANDOM BUSINESS INT01
backup=true
Name=SOMENAME"

它只是从当前记录中提取"之间的字符串,用该字符串中的换行符替换所有制表符,然后在打印之前将记录重新组合在一起。

答案 1 :(得分:1)

你可以试试这个sed(GNU sed)4.4

sed -E ':A;s/(".*)\t(.*")/\1\n\2/;tA' TSV_Data_File

使用OSX sed,您可以试试这个。 我认为\ t没问题。

sed -E '
:A
s/(".*)\t(.*")/\1\
\2/
tA
' TSV_Data_File

简要解释:

抓住"

内的文字

用\ n

替换最后一个\ t

如果发生替换跳转到A,则继续

使用awk:

awk -v RS ='"' ' NR%2 == 0 {GSUB(" \吨"" \ n")} 1' ORS ='"' TSV_Data_File

答案 2 :(得分:0)

这基本上是 ctac _&#39> s awk答案转换为perl:

perl -pe'1 while s/(".*)\t(.*")/$1\n$2/s' file.tsv

\t可能会被\t\s*替换,如果您只想在每个标签中添加一个换行符,那么

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's/\S\+=\S\+/\n&/2g' file

在包含=的第二个或更多非空字符串之前插入换行符。