2016-10-10 3 views
1

Ich möchte alle Instanzen target mit replace in der folgenden file.csv mit Bash ersetzen, aber nur, wenn die Linie es enthält nicht enthält auch die Zeichenfolge skipline:Wie wird eine Zeichenfolge in einer Datei nur dann ersetzt, wenn die Zeile, die sie enthält, auch keine bestimmte Zeichenfolge mit Bash enthält?

file.csv:

abc,abc,keepline,target,abc,abc 
abc,abc,skipline,target,abc,abc 

gewünschte Ausgabe:

abc,abc,keepline,replace,abc,abc 
abc,abc,skipline,target,abc,abc 

ich versuche sed zu verwenden:

sed 's/target/replace' file.csv > newfile.csv 

Wie kann ich Logik einbeziehen, um jede Zeile auf die Zeichenkette skipline zu prüfen?

Antwort

1
% sed '/skipline/!s/target/replace/g' input 
abc,abc,keepline,replace,abc,abc 
abc,abc,skipline,target,abc,abc 

In sed suchen und ersetzen möchten, können Sie angeben, wo zu ersetzen: /foo/ sucht nach foo, 1,5 bedeutet von Zeile 1 bis 5. A ! invertiert diese Suche.

1

Dadurch werden die Zeilen ignoriert, die skipline enthalten. Und ersetzen Sie Ziel durch replace Schlüsselwort.

awk '!/skipline/ {gsub(/target/,"replace")}1' input 
    abc,abc,keepline,replace,abc,abc 
    abc,abc,skipline,target,abc,abc 

die Änderungen in Orignal-Datei zu tun:

awk '!/skipline/ {gsub(/target/,"replace")}1' input >input.tmp && mv input.tmp input 
2

Sie Linien auswählen, können Sie

$ cat ip.txt 
abc,abc,keepline,target,abc,abc 
abc,abc,skipline,target,abc,abc 

$ sed '/skipline/! s/target/replace/' ip.txt 
abc,abc,keepline,replace,abc,abc 
abc,abc,skipline,target,abc,abc 
0

Mit Bash und Teilzeichenfolge Ersatz:

i=abc,abc,keepline,target,abc,abc 
if [[ ! $i =~ "skipline" ]] ; then 
    i=${i//target/replace} 
fi 
echo $i 
abc,abc,keepline,replace,abc,abc 

i=abc,abc,skipline,target,abc,abc 
if [[ ! $i =~ "skipline" ]] ; then 
    i=${i//target/replace} 
fi 
echo $i 
abc,abc,skipline,target,abc,abc 
Verwandte Themen