2011-11-17 4 views
8

Je veux simplement faire à la suiteremplaçant motif de lignes multiples dans sed

remplacer

EXTRATHING { 
}; 

par

SOMETHING {}; 

dans inputfile. Pour cela, j'ai essayé

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt 

Cela ne fonctionne pas. Quelqu'un peut-il suggérer quelle serait la bonne façon de le faire avec sed?

Répondre

5
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt 

le feraient.

Le problème avec ceci est qu'il stocke toute la chaîne d'entrée dans le tampon de sed.

Voir sed and Multi-Line Search and Replace pour plus d'informations et une version plus efficace.

0

Cela pourrait fonctionner pour vous:

sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt 

ou si vous souhaitez modifier le fichier d'origine:

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file 

EDIT: comme demandé voici un exemple:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' 
> aaa 
> EXTRATHING { 
> }; 
> bbb 
> EXTRATHING { 
> }; 
> ccc 
> ! 
aaa 
SOMETHING{} 
bbb 
SOMETHING{} 
ccc 

EDIT : Si la première et la dernière adresse sont des lignes consécutives, utilisez ceci:

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}' 
> aaa 
> EXTRATHING { 
> bbb 
> }; 
> ccc 
> EXTRATHING { 
> }; 
> ddd 
> ! 
aaa 
EXTRATHING { 
bbb 
}; 
ccc 
SOMETHING{} 
ddd 

Une autre façon (peut-être plus facile?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D' 
SOMETHING {}; 
+0

prenez soin de signaler votre exemple que cela fonctionne ;-)? Je viens de recevoir le document original. Bonne chance. – shellter

+0

Merci @potong. Cependant, votre commande supprimera également le motif d'origine s'il existe d'autres lignes entre "EXTRATHING {" et "};". Je ne veux pas que ceux-ci soient remplacés.Donc, ce qui suit ne devrait pas être remplacé "EXTRATHING {\ n quelquechose \ n};". – bbv

+0

Merci, je vois que votre code fonctionne avec le sed 4 *, mais pas avec la version non-versionnée que j'ai dans UWIN. Utilisez-vous une expression de plage pour capturer les deux lignes? c'est-à-dire '/ x /,/y /'? Bonne chance à tous. – shellter

3

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

+4

Pouvez-vous expliquer cela s'il vous plaît? Merci. :) – Ray

+1

Je pense que c'était basé sur une mauvaise compréhension de la question. – BCS

3
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt 
1
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file 

testé ci-dessous:

> cat temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
EXTRATHING { 
}; 
ghekg 
jhgjk 
wefjkwngk 
EXTRATHING { 
    }; 
jbgvjnrg 
jbfw 
wefnkwk 
EXTRATHING { 
}; 
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
SOMETHING{}; 
ghekg 
jhgjk 
wefjkwngk 
SOMETHING{}; 
jbgvjnrg 
jbfw 
wefnkwk 
SOMETHING{}; 
> 

si vous voulez modifier le fichier en ligne . ajoutez un drapeau -i. comme:

perl -i -lne '.......' your_file 
0

Il est difficile de le faire dans sed, doit écrire les indices. Cependant, vous pouvez utiliser une doublure en utilisant perl:

perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt 

où -0777 est séparateur enregistrement (ligne de fond dans des fichiers texte) -p exécute la commande pour tous les fichiers et impression à l'écran -e dit son un commande de ligne

Questions connexes