入力:
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
表現を改良して、 in が存在する場合はsed
それを削除することができます。\r
sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file
行頭と行末は 1 行に 1 回だけ存在するため、フラグはg
省略できます。「置換」内の二重引用符をエスケープする必要はありません。「代替」を使用してさらに簡略化します。
sed -e 's/^\|\r*$/"/g' -e 's/+/","/g' file