Perl結合を適切に使用して、各出現に何かを追加することができません-「演算子が期待される場所に配列が見つかりました」エラーを取得する


1

このようなログ行があります-

/mnt/internal-app/logs/internal-app.log_2019-08-21.log.gz:2019-08-21 07:31:14,153 5458142 [XNIO-3 task-4] INFO  c.c.p.i.m.ws.FileManger [FileName.java:1838] - UUIDs in this bucket 8501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576
/mnt/internal-app/logs/internal-app.log_2019-08-21.log.gz:2019-08-21 07:31:14,153 5458144 [XNIO-3 task-4] INFO  c.c.p.i.m.ws.FileManger [FileName.java:1838] - UUIDs in this bucket 6501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576

catの出力でperlを使用してUUIDを取得し、それぞれを二重引用符で囲みます-

cat eligible_uuids_final_app1.txt | perl -ne 'chomp;if(s/^.*UUIDs in this bucket //){@uuids=split(/,/); print "," , join ",",map{qq/"$_"/} @uuids; }'

取得 -

"9556896620363267700","7159125371810704365"

さらに、これらをそれぞれ最初の括弧で囲みます。私はperlの専門家ではありませんが、開始ブラケットを追加できました-

cat eligible_uuids_final_app1.txt | perl -ne 'chomp;if(s/^.*UUIDs in this bucket //){@uuids=split(/,/); print "," , join ",(",map{qq/"$_"/} @uuids; }'

取得 -

("9556896620363267700",("7159125371810704365"

末尾のブラケットを追加しようとしています-

cat eligible_uuids_final_app1.txt | perl -ne 'chomp;if(s/^.*UUIDs in this bucket //){@uuids=split(/,/); print "," , join ",(",map{qq/"$_"/}, join ,")" @uuids;  }'

構文エラーの取得-

$ cat eligible_uuids_final_app1.txt | perl -ne 'chomp;if(s/^.*UUIDs in this bucket //){@uuids=split(/,/); print "," , join ",(",map{qq/"$_"/}, join ,")" @uuids;  }'
Array found where operator expected at -e line 1, near "")" "
    (Missing operator before  ?)
syntax error at -e line 1, near "},"
Execution of -e aborted due to compilation errors.

1
完璧なcatときに使用する必要はありません<
トビースパイト

2
私はあなたが正確に何をしたいの出力は明らかではないんだ-あなただけ置き換えることができないmap{qq/"$_"/}map{qq/"($_)"/}
steeldriver

ああ、簡単でした。@steeldriverを回答として追加してください。
サンディーパンナス

@SandeepanNathよろしくお願いします
steeldriver

回答:


0

あなたがしたい場合は、各要素は括弧だけでなく、引用符で囲むために、あなたは、単に既存のものを追加することができmap、すなわち置き換えるブロックを

map{qq/"$_"/}

沿って

map{qq/"($_)"/}

0

配列要素を(,-の(,すべての要素の間に置くことで結合したくありません@uuids

(結合前と結合)後に印刷する必要があります。

たとえば、次を使用しprintfます。

$ perl -ne '
  chomp;
  if(s/^.*UUIDs in this bucket //) {
    @uuids=split(/,/);
    printf ",(%s)", join ",",map{qq/"$_"/} @uuids;
  }' eligible_uuids_final_app1.txt
,("8501792126581991569","8073766106536916628","4830289023695906800","6135982080116553120","8306484440313978157","9040948912536460872","8471856544054164043","5431263453539111247","7661719762428556576"),("6501792126581991569","8073766106536916628","4830289023695906800","6135982080116553120","8306484440313978157","9040948912536460872","8471856544054164043","5431263453539111247","7661719762428556576")

(読みやすくするためにワンライナーに追加された改行)

内側(...)または外側の先頭のコンマが必要かどうかはわかりません。前者を想定しています。必要に応じてprintf形式の文字列を調整します。

改行を追加することもできます(例:)printf ",(%s)\n", ....;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.