2016-08-16 6 views
1

Ich versuche, die Zeile aus der Datei grep und dann von $ 1 Ich versuche, das Zeichen zu ändern. zBGrep und ersetzen Sie das Zeichen von grepped Ergebnis

cat file1.txt 
Surjit 
Shilpa 
cchiku 
end of file 

Ich habe versucht, und grep die Linie, die mit s beginnen.

grep -e "S" 

Dann mag ich das 4. Zeichen x für alle grep Ergebnis im file1.txt

Ich habe versucht, ersetzen

sed -i "s/./x/4" file1.txt 

Wie kann ich dies nur für grep Ergebnisse?

Antwort

3

können Sie verwenden, um die sed '/pattern/s/find/replace/' file Syntax:

sed '/^S/s/./x/4' file 
#  ^^ ^^^^^^^ 
#  | replace the 4th character with x 
#  | 
#  on lines starting with S 

Mit Ihrer Datei:

$ sed '/^S/s/./x/4' file 
Surxit 
Shixpa 
cchiku 
end of file 

Hinweis I /^S/ als Muster bin mit Linien entsprechen mit S beginnen, denn wenn man nur sagen /S/ es entspricht jeder Zeile enthält S. Der Anker ^ zeigt den Anfang der Zeile.

+0

Es funktioniert. Wenn ich ein Muster verwende und etwas $ 1 aus der Zeile greife, wird es dann funktionieren? Ich kann grep -e "regxp" | nicht verwenden sed something – Raj

+0

@Raj natürlich, sag einfach "sed" /$1/s/./x/4 "file' oder lege es in eine var' var = $ 1' und dann 'sed" /$var/s/./ x/4 "file' – fedorqui

+1

Und natürlich können Sie die unnötige Verwendung von' grep' vermeiden, indem Sie etwas wie 'sed -n -e'/^ S/s /./ x/4p'' verwenden, um nur die Zeilen zu drucken das waren die ursprünglichen Muster. – ghoti

2

Eine Alternative zu fedorqui's answer ist die einschließen mit S Zustand in das Muster beginnend selbst:

sed 's/^\(S..\)./\1x/' file 

Die Befehlsübereinstimmungen Linien mit S beginnt und setzt den S und die folgenden zwei Zeichen in eine passende Gruppe . Im Ersatzteil wird der Inhalt der passenden Gruppe wiederverwendet und das nächste Zeichen wird durch x ersetzt.

+0

Nice one! Ich bin neugierig und was intern am besten ist: die Suche getrennt durchzuführen und dann den Ersatz (wie ich) oder in den passenden Teil wie Sie getan haben. – fedorqui

+0

Ich denke, es hängt von den Eingabedaten ab, aber lass es uns einen kurzen Versuch geben! :) .... Minute ... – hek2mgl

+1

@fedorqui Ich habe gerade einen kurzen Test: Katze die obige Eingabedatei mit sich selbst, bis wir eine Datei mit 200 Millionen Zeilen haben. Ihre Lösung dauerte 1:59 Minuten, meine dauerte 1:17 Minuten. Eigentlich macht das Sinn. – hek2mgl

2
awk -v FS="" -v OFS="" '/^S/{$4="x"}1' infile 
Surxit 
Shixpa 
cchiku 
end of file