2016-06-04 10 views
0

Ich habe eine zusätzliche Kredit-Zuordnung, die mich fragt, um 3 Argumente zu verwenden, um jemandes Namen auf ihre Aufgabe loswerden und ersetzen Sie es mit mir. erste Argument ist der Name der Datei zweite Argument ist die "oldstring" dritte Argument ist die "newstring"in bash mit sed ersetzen "oldstring" mit "newstring"

das ist mein Skript:

#!/bin/bash 
file=$1 
oldname=$2 
newname=$3 
changed=`grep -R "$oldname" $file | sed -i "s/$2/$3/g" $file` 
done 

dies ist die Datei, die ich durch

Suche bin
int main(int argc, char**argv) 
{ 
printf("Assignment #3-4, Smarty McSmartypants, [email protected]\n"); 
printf("%0.4f\n",cos(sqrt(atoi(argv[1]))/10.0f));' 

ich werde „Smarty McSmartypants“ mit „meinem Namen“ ersetzen, die perfekt funktionieren gut, aber wenn ich es noch einmal zu versuchen laufen „[email protected] \ n“ mit „my @ E-Mail“ zu ersetzen, gibt es keine Änderungen. Kann jemand dieses Phänomen erklären?

+0

Wie denken Sie seine stdin von 'grep -R "$ oldname" file' $ gekommen ist, das Verhalten von' sed -i "s/$ 2/$ 3/g" Ändern $ Datei'? –

+0

Wie für Ihre direkte Frage, obwohl - "sed" keine literalen Strings nimmt, braucht es * regexes *. Nicht das Gleiche. '\ n' als Regex stimmt nicht mit' \ n' als Literal überein. –

+0

Auch? Zitieren Sie Ihre Erweiterungen, * einschließlich * den Dateinamen. '" $ file "', nicht '$ file'; Andernfalls werden Dateinamen mit Leerzeichen in mehrere Argumente aufgeteilt. –

Antwort

0

sed wird Zeile für Zeile abgeglichen, sodass Sie sie nicht als Ersatz für Zeilenumbrüche verwenden können. Es sieht so aus, als ob Sie versuchen, ein Literal \ gefolgt von einem n zu ersetzen. In diesem Fall müssen Sie jedoch die \ so umgehen, dass sed die \n nicht als Escape-Sequenz behandelt.

vergleichen:

$ echo 'foo\nbar' | sed 's/foo\n/fib/g' 
foo\nbar 

$ echo 'foo\nbar' | sed 's/foo\\n/fib/g' 
fibbar