我有一些文本文件数据,我正在解析与SED,AWK和Perl。
product {
name { thing1 }
customers {
mary { }
freddy { }
bob {
spouse betty
}
}
}
从“customers”部分,我尝试获得类似以下内容的输出:
mary{ }
freddy{ }
bob{spouse betty}
使用:sed -n -e "/customers {/,/}/{/customers {/d;/}/d;p;}" $file'
输出如下:
mary { }
freddy { }
bob {
spouse betty
}
我如何将“bob”customer连接到一行并删除多余的空格?产生此特定输出的主要原因是,我正在编写一个脚本,以获取文本文件中的“customer”字段和其他字段,然后将它们输出到csv文件中。它看起来像这样。我知道这在其他语言中可能更容易,但我知道bash。
output.csv
product,customers,another_column
thing1,mary{ } freddy{ } bob{spouse betty},something_else
6条答案
按热度按时间8fsztsew1#
数据恰好具有有效的tcl列表语法:
创建输出.csv
nlejzf6q2#
编辑 * 请参见末尾以生成完整的所需输出 *
这里是regex,可能是任何语言的,在一个字符串中运行整个文件。这是假设在一个客户下只能有一层嵌套,换句话说,
bob
不能有{ pets { dog } }
之类的。customers
截面浸提液含量然后将换行符+空格折叠为单个空格
然后从字符串中删除空格,如
bob { spouse }
,但不从mary { }
如果
bob
和船员真的可以只是单词字符,那么我们可以使用更好的\w
来代替[^{}]
。总之,在Perl命令行程序中似乎是所希望的
对于问题中给出的数据,将打印
要把每个客户打印在一个单独的行上可以这样做例如
(to是代码的最后一行)
现在我意识到还有更多的内容需要捕获和打印,如上一段所述。
重定向到
output.csv
的输出如问题所示。uklbhaso3#
仅限于您展示的示例。在GNU
awk
中,您可以尝试以下awk
代码。我们可以在单个GNUawk
中完成,我们不需要将您的sed
命令的输出传递给任何其他工具。只需将您的Input_file传递给此awk
程序即可。***第一个解决方案:***要获取
customers
节到}
之间的输出,其右括号和值没有开始空格,请尝试以下GNUawk
解决方案。输出如下:
***第二个解决方案:***若要在值前使用起始空格,请尝试以下代码。
输出如下:
***说明:***简单的说明是在GNU
awk
中将RS(记录分隔符)设置为\n[[:space:]]+customers {[[:space:]]*.*\n[[:space:]]+}
,以仅匹配所需的匹配项。然后在此awk
程序的主块中,根据sub
(替换函数)的要求删除所有不必要的(不需要的字符串部分),然后使用match
函数和regex(.*{)[[:space:]]*([^\n]*)(.*)
,其中有3个捕获组,其值存储到一个名为arr
的数组中,然后我替换其中的所有换行符/空格,然后使用RT打印当前行的值。yzckvree4#
以下代码示例演示了所提供示例数据最基本解析器
此代码恢复数据结构,然后可以以任何可能方式使用,例如存储为 CVS,JSON,YAML 文件
在真实的生活中,输入数据可能会有很大的不同,此代码可能无法正确处理它。
提供的代码仅用于教育目的。
输出量
djp7away5#
也许是
ed
使用临时文件,写入新文件会更容易一些。
out.txt
和output.csv
,p
。lp0sw83n6#
这里输入的文件称为“栈”。