Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
SERVICE_NAME
1 first service
2 second service
我需要在 Linux 中过滤掉这个输出并得到结果
first_service,second_service
答案1
使用GNUsed
$ sed -Ez 's/[^0-9]*[^[:alpha:]]*([^ ]*) ([^\n]*)\n?/\1_\2,/g;s/,$/\n/' input_file
first_service,second_service
答案2
使用乐(以前称为 Perl_6)
~$ raku -e 'my $i=0; my @a; for lines() { \
$i=1 and next if /^ \s+ SERVICE_NAME /; \
if ($i.Bool) { @a.push: .words.skip.join("_") } else {next};}; \
.put for @a.join(",");' file
或者
~$ raku -e 'my @a; for lines() { \
@a.push( $_.words.skip.join: "_" ) if /^ \s+ SERVICE_NAME / ^fff * }; \
.put for @a.join(",");' file
输入示例:
Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
SERVICE_NAME
1 first service
2 second service
示例输出:
first_service,second_service
Raku 是 Perl 家族的一种编程语言。该项目由 Larry Wall 及其同事于 2000 年启动。首次发布于 2015 年 12 月。Perl6 语言更名为乐2019年。
上面的第一个答案:代码声明了一个标量$i
和一个数组@a
。输入是用 获取的lines()
。在块内,搜索{...}
哨兵线。^ \s+ SERVICE_NAME
如果找到,则$i
设置为1
并且代码继续执行该next
行。
$i
从这里开始,如果强制转换为Bool
an is ,则运行最后两个语句True
。当$i.Bool
is时True
,该{...}
块被输入:该行被分成空格分隔.words
,第一个单词(即数字)被skip
ped ,其余部分join
用下划线 ed 。最后,该行出来了put
,join
ed 带有逗号。
上面的第二个答案:代码使用 Raku 的sed
类似“触发器”运算符fff
及其变体。^fff
代码中的变体打开,用于在找到哨兵线后捕获行SERVICE_NAME
。这*
意味着直到目标文件末尾的所有行都被push
添加到数组中。请参阅上面有关文本处理和 out 的讨论put
。
https://docs.raku.org/language/operators#infix_^fff
https://raku.org
答案3
这个解决方案肯定还有改进的空间。如果我做得更好sed
,我觉得这可以压缩成一次调用sed
。grep
如果我知道如何sed
删除不以数字字符串开头的模式空间,甚至可以消除。可能会更好awk
。
grep -E '^[0-9]+' input_file |
sed -E -e 's/^[0-9]+ +//' -e 's/ /_/g' |
sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'
$ cat << EOF > input_file
Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
SERVICE_NAME
1 first service
2 second service
39 third of four
427 fourth and final service
EOF
$ grep -E '^[0-9]+' input_file |
sed -E -e 's/^[0-9]+ +//' -e 's/ /_/g' |
sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'
first_service,second_service,third_of_four,fourth_and_final_service