Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
SERVICE_NAME
1 first service
2 second service
Linuxでは、この出力をフィルタリングして結果を取得する必要があります。
first_service,second_service
答え1
GNUの使用sed
$ 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ファミリーのプログラミング言語です。このプロジェクトは、ラリー・ウォールと同僚によって2000年に始まりました。 2015年12月に初めて公開されました。 Perl6言語名が変更されました幸せ2019.
上記の最初の答え:コードはスカラー$i
と配列を宣言します@a
。を使って入力を取得しますlines()
。ブロック内で{...}
センチネルラインを検索してください。^ \s+ SERVICE_NAME
見つかった場合は$i
設定され、1
コードはそのnext
行に続きます。
$i
ここでキャストがBool
isの場合、最後の2つのステートメントが実行されますTrue
。$i.Bool
isの場合、True
ブロック{...}
が入力されます。行が空白に分割され、.words
最初の単語(数字など)がskip
追加され、残りにjoin
下線が付けられます。最後に、カンマで終わる行put
が出てきます。join
上記の2番目の答え:コードはRakuのsed
同様の「トリガー」演算子fff
とそのバリアントを使用します。^fff
センチネルラインが見つかった後、ラインをキャプチャするためにコードのバリエーションが開きますSERVICE_NAME
。これは*
、ターゲットファイルの最後までのすべての行が配列push
に追加されることを意味します。テキスト処理とアウトの上記の説明を参照してくださいput
。
https://docs.raku.org/言語/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