# text datei mit grep bearbeiten

## pieter_parker

hab eine text datei mit 50 zeilen

jede zeile hat "x123", wie kann ich mit grep das "x123" und alles was danach in dieser zeile folgt wegschneiden ?

----------

## mv

grep ist dazu das falsche Tool. Du suchst sed. Beispielsweise 

```
sed -e "s/x123(.*)//" inputdatei >outputdatei
```

----------

## think4urs11

 *mv wrote:*   

> grep ist dazu das falsche Tool. Du suchst sed. Beispielsweise 
> 
> ```
> sed -e "s/x123(.*)//" inputdatei >outputdatei
> ```
> ...

 

Dann aber doch gleich mit inplace-editing ... 

```
sed -ie "s/x123(.*)//" inputdatei
```

----------

## Hollowman

Hi

Grep ist da genau das richtige, er will ja die ganze Zeile raus haben.

grep -v x123 DATEI

sollte dein gewünschtes Ergebnis liefern. Wenn ja dann einfach

grep -v x123 DATEI >> NEUEDATEI

Sebastian

----------

## mv

 *Hollowman wrote:*   

> Grep ist da genau das richtige, er will ja die ganze Zeile raus haben.

 

Nein, er will in der Zeile den Text nach x123 (einschließlich) abschneiden, nicht die Zeile entfernen. Letzteres ginge übrigens natürlich auch mit sed: 

```
sed -e /x123/d
```

Hier hat sed gegenüber grep den Vorteil, die Option -i zu kennen, falls man sie braucht (und GNU sed benutzt).

Übrigens hatte ich -i bewusst nicht angegeben: Zum Testen ist diese nämlich eine schlechte Idee, und außerdem ist sie nicht POSIX.

----------

## Hollowman

 *Quote:*   

> wie kann ich mit grep das "x123" und alles was danach in dieser zeile folgt wegschneiden

 

Das steht doch x123 und alles danach wegschneiden. Das macht nu ma grep. Geht mit sed natürlich auch.

Sebastian

----------

## think4urs11

 *Hollowman wrote:*   

> Das steht doch x123 und alles danach wegschneiden. Das macht nu ma grep.

 

Seit wann?

----------

## Hollowman

Bitteschön

```
eimer@Laptops ~ $ cat test

x123 das soll weg

das nicht

x123 das wieder

das wieder nicht

x123 weg isses

usw

eimer@Laptops ~ $ grep -v x123 test

das nicht

das wieder nicht

usw

```

Ich glaub irgendwie reden wir hier alle aneinander vorbei.

Das sed macht nur das x123 weg und lässt den Rest der Zeile stehen. Er will ja aber die ganze Zeile weg haben.

Sebastian

----------

## franzf

Er will aber auch sowas:

Das bleibt x123 das nicht 

->

Das bleibt

Und das geht mit deinem grep nicht, der haut die ganze Zeile weg!

----------

## Hollowman

Ah OK da hab ich nicht dran gedacht.

Sebstian

----------

## think4urs11

 *Hollowman wrote:*   

> Das sed macht nur das x123 weg und lässt den Rest der Zeile stehen. Er will ja aber die ganze Zeile weg haben.n

 

Würde aber wenig Sinn ergeben denn im ursprünglichen Post steht auch 'in *jeder* Zeile steht x123'. Würde in deinem Beispiel eine leere Ausgabe erzeugen - dafür ist grep nun wirklich oversized  :Wink: 

----------

## Yamakuzure

sed... *Quote:*   

> jede zeile hat "x123", wie kann ich mit grep das "x123" und alles was danach in dieser zeile folgt wegschneiden ?

 Ich nehme dafür perl-pie:

```
sed@sed-notebook ~ $ cat test.txt

Bleibt da x123 kommt weg 

x123 das geht komplett weg

Bleibt komplett da x123

Das auch x123 aber das wieder weg

sed@sed-notebook ~ $

sed@sed-notebook ~ $

sed@sed-notebook ~ $ perl -p -i.bak -e 's/^(.*)(?:x123.*)$/$1/mig' test.txt

sed@sed-notebook ~ $ cat test.txt

Bleibt da 

Bleibt komplett da 

Das auch 

```

Zumindest wenn ich es richtig verstanden habe. Allerdings sind RegEx ja nicht jedermanns Sache...

Achja: dank "-i.bak" gibts die originaldatei noch als "test.txt.bak"

Edith wollte noch anmerken: Wenn du statt "x123" einen Seperator aus nur einem Zeichen bauen kannst, gehts noch einfacher. Sollte dein Seperator zum Beispiel ";" sein:

```
cut -d ';' -f 1 Quelldatei >> Zieldatei
```

Zur Not kann man das kleine regEx da oben umformen zu

```
perl -p -i.bak -e 's/x123/;/mig' Quelldatei
```

----------

