我试着弄清楚如何完成一些正则表达式匹配以插入新行。下面的示例输入/输出......
示例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等)。任何/所有帮助表示赞赏!
答案 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
在包含=
的第二个或更多非空字符串之前插入换行符。