Bindestriche in einer Datei mit sed entfernen

0

Ich möchte den Befehl sed verwenden, um einige Bindestriche in einer Zeichenfolge (innerhalb einer Datei) zu entfernen.

TEXT=abcdef-lalala-someText-yahoo

Nach der sed-Ausführung sollte diese Zeile folgendermaßen aussehen:

TEXT=abcdeflalalasomeTextyahoo

Danke im Voraus

Wilmer
quelle
-1 für die nicht ordnungsgemäße Beschreibung, wonach Sie gesucht haben.
Barlop
Wilmer hat seine Frage ziemlich vernünftig formuliert. Wörtlich genommen und unter Berücksichtigung der Programmiersprache ist es ziemlich klar, was er will. Er spricht von "einer" Zeichenkette und "dieser" Zeile, erwähnt jedoch keine oder alle Zeilen. Typischerweise bedeuten "foo", "abcdef", "lalala" variable Daten; daher kann ich davon ausgehen, dass "TEXT =" und "yahoo" Konstanten sind (sofern er nichts anderes sagt). Ich war ursprünglich ambivalent zu "yahoo", aber seit den Abstrichen habe ich mich wieder auf die Frage konzentriert und sollte meine Antwort anpassen, obwohl Wilmer so freundlich war, sich nicht über mein Versehen zu beschweren.
Peter.

Antworten:

1

Aufgrund Ihres weiteren Kommentars zu Nifles Antwort ist dies möglicherweise eher das, wonach Sie suchen. Es wird nur auf Zeilen gewirkt, TEXT=die von 4 '-' begrenzten Textsegmenten gefolgt werden .

GNU sed verwenden ("TEXT" und "yahoo" als Konstante behandeln)

sed -re 's/^(TEXT=[^-]+)-([^-]+)-([^-]+)-(yahoo)$/\1\2\3\4/'

Oder mit GNU sed (den gesamten Text nach "=" als vairable behandeln)

sed -re 's/^(TEXT=[^-]+)-([^-]+)-([^-]+)-([^-]+)$/\1\2\3\4/'

Oder für die POSIX-Portabilität (Behandlung des gesamten Texts nach "=" als vairable):

sed 's/^\(TEXT=[^-][^-]*\)-\([^-][^-]*\)-\([^-][^-]*\)-\([^-][^-]*\)$/\1\2\3\4/'
Peter.O
quelle
3

Bitte schön:

echo "TEXT=abcdef-lalala-someText-yahoo" | sed 's/-//g'
TEXT=abcdeflalalasomeTextyahoo
Nifle
quelle
1
sed -i 's/-//g' filenameist, was es in der Datei tatsächlich ändern würde, es würde jedoch JEDES -in der Datei entfernen , was möglicherweise nicht das ist, was Sie wollen.
Rob
Obwohl das funktioniert, dachte ich etwas raffinierter darüber nach, zum Beispiel: sed -i 's / TEXT = ......-......-........ -..... / wayToTellSedToLeaveOriginal6CharsWayToTellSedToLeaveOriginalSecond6CharsAndSoOn "7g 'Dateiname
Wilmer
0

Hier sind meine zwei Cent ... Sie können die Übereinstimmung (TEXT =) vor dem Ersatzbefehl hinzufügen ... Einfach so:

sed '/TEXT=/s/-//g'

Die Ergebnisse werden sein:

echo "TEXT=abcdef-lalala-someText-yahoo" | sed '/TEXT=/s/-//g'
TEXT=abcdeflalalasomeTextyahoo

Der Ersatzbefehl wird nur ausgeführt, wenn er mit der ersten Klausel übereinstimmt, in diesem Fall mit "TEXT =". Ich denke, dass der Befehl einfacher und eleganter sein wird.

user3681552
quelle