CRLF での sed 置換が機能しない

CRLF での sed 置換が機能しない

入力:

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

関連情報