我正在努力弄清楚如何完成一些正则表达式匹配以插入新行。下面的示例输入/输出...
示例 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 等)。感谢任何/所有帮助!
最佳答案
这将在任何 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"
它只是从当前记录中提取 "
之间的字符串,用该字符串中的换行符替换所有制表符,然后在打印之前将记录放回原处。
关于regex - 在 TSV 的匹配之前/之后插入换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602451/