Sed-Ersetzen bei CRLF funktioniert nicht

Sed-Ersetzen bei CRLF funktioniert nicht

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 sedAusdrücke zur Verarbeitung hinzufügen \r.

Antwort2

Sie können den sedAusdruck verfeinern, um es zu eliminieren, \rfalls es vorhanden ist:

sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file

Da Zeilenanfang und Zeilenende nur einmal in einer Zeile vorkommen, gkann 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

verwandte Informationen