Eingang:
bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user
Gewünschte Ausgabe:
"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user"
Befehl:
echo "bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user" | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g'
Das funktioniert einwandfrei und ich erhalte die gewünschte Ausgabe, bei der das Zeilenendezeichen LF ist. Sobald ich die Datei in Windows bearbeite und speichere, wird das Zeilenendezeichen LF durch CRLF ersetzt. Und der letzte sed-Ausdruck, bei dem ich das Zeilenende durch ersetze, $
schlägt "
fehl und führt zu einem unerwarteten Ergebnis. Unerwartetes Ergebnis:
"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user
Schauen Sie sich das Fehlende "
am Ende an.
Gibt es da draußen irgendwelche Sed-Experten, die mir zu Hilfe kommen können? :).
Antwort1
Das Zitat ist tatsächlich vorhanden, hat aber beim Drucken auf dem Bildschirm das ursprüngliche Zitat ersetzt:
$ 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/Wagenrücklauf verschiebt die Position des virtuellen Cursors, der zur Textausgabe verwendet wird, an den Zeilenanfang, sodass das abschließende "
Zeichen (nur im Terminal) das erste Anführungszeichen überschreibt.
Möglicherweise möchten Sie die Eingabe zuerst senden dos2unix
, es sei denn, Sie möchten sed
Ausdrücke zur Verarbeitung hinzufügen \r
.
Antwort2
Sie können den sed
Ausdruck verfeinern, um es zu eliminieren, \r
falls es vorhanden ist:
sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file
Da Zeilenanfang und Zeilenende nur einmal in einer Zeile vorkommen, g
kann das Flag weggelassen werden. Die Anführungszeichen im „Ersatz“ müssen nicht maskiert werden. Verwenden Sie „Alternation“, um es weiter zu vereinfachen:
sed -e 's/^\|\r*$/"/g' -e 's/+/","/g' file