入力する:
bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user
希望の出力:
"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user"
注文する:
echo "bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user" | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g'
これはうまく機能し、ラインターミネーターがLFの場合は望ましい出力を提供します。 Windows でファイルを編集して保存すると、行終端 LF が CRLF に置き換えられます。行末を最後のsed式に置き換えることができず、$
予期"
しない結果が発生します。予期しない結果:
"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user
"
最後に欠けているものが何であるかを見てください。
どんなsedの専門家でも私を救うことができます:).
答え1
参照は実際には存在しますが、画面に印刷するときに初期参照を置き換えました。
$ printf '%s\r\n' 'foo' | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g' | od --format c
0000000 " f o o \r " \n
0000007
\r
"
/CR/キャリッジリターン、テキスト出力に使用される仮想カーソルの位置を行の先頭に移動し(端末のみ)、最初の引用符を上書きします。
入力を処理するための式をdos2unix
追加したくない場合は、最初に入力を送信することをお勧めします。sed
\r
答え2
次の状況が発生sed
しないように式を最適化できます。\r
sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file
行の先頭と末尾は1行に1回しか存在しないため、g
このフラグを削除できます。 「replace」で二重引用符をエスケープする必要はありません。さらに簡単にするには、「代替」を使用します。
sed -e 's/^\|\r*$/"/g' -e 's/+/","/g' file