Newsgroup: it.comp.os.linux.iniziare
Titolo: sostituire testo con backslash all'interno dei file

+ find /tmp/test -type f -readable -writable -exec sed -i 
's/a\b\c/x\y/g' '{}' ';'
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
 
Si può fare in modo che la backslash venga accettata?


Chiedo scusa, mi spiego meglio:
 
ho creato questo script (Scrivania/replacing.sh)
 
#!/bin/bash
 
dir=$1
search=$2
replace=$3
 
find $dir -type f -readable -writable -exec sed -i 
"s/$search/$replace/g" {} \;
 
quindi lo vado ad eseguire
 
$ bash -x Scrivania/replacing.sh /tmp/test "a\\b\\c" "x\\y"
+ dir=/tmp/test
+ search='a\b\c'
+ replace='x\y'
+ find /tmp/test -type f -readable -writable -exec sed -i 
's/a\b\c/x\y/g' '{}' ';'
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
 
 
Possibile soluzione?
 

Il 02/11/2015 10:43, alex ha scritto:

Chiedo scusa, mi spiego meglio:
 
ho creato questo script (Scrivania/replacing.sh)
 
#!/bin/bash
 
dir=$1
search=$2
replace=$3
 
find $dir -type f -readable -writable -exec sed -i
"s/$search/$replace/g" {} \;
 
quindi lo vado ad eseguire
 
$ bash -x Scrivania/replacing.sh /tmp/test "a\\b\\c" "x\\y"
+ dir=/tmp/test
+ search='a\b\c'
+ replace='x\y'
+ find /tmp/test -type f -readable -writable -exec sed -i
's/a\b\c/x\y/g' '{}' ';'
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine
della riga
 
 
Possibile soluzione?
 
 

Il 02/11/2015 10:43, alex ha scritto:

Chiedo scusa, mi spiego meglio:
 
ho creato questo script (Scrivania/replacing.sh)
 
#!/bin/bash
 
dir=$1
search=$2
replace=$3
 
find $dir -type f -readable -writable -exec sed -i 
"s/$search/$replace/g" {} \;
 
quindi lo vado ad eseguire
 
$ bash -x Scrivania/replacing.sh /tmp/test "a\\b\\c" "x\\y"
+ dir=/tmp/test
+ search='a\b\c'
+ replace='x\y'
+ find /tmp/test -type f -readable -writable -exec sed -i 
's/a\b\c/x\y/g' '{}' ';'
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
sed: espressione -e #1, carattere 13: Carattere "backslash" alla fine 
della riga
 
 
Possibile soluzione?
 

Il 02/11/2015 10:43, alex ha scritto:
 
mi scuso con danieles, per fare delle prove ho usato per sbaglio il suo 
nick :(


provato a raddoppiare con \\ invece che \ ?
 


ma hai visto quello che ho fatto?


e vedo un backslash
 
 
's/a\b\c/x\y/g'
 
in
 
's/a\\b\\c/x\\y/g'
 
 


 
hai visto nel posto sbagliato
 
$ bash -x Scrivania/replacing.sh /tmp/test "a\\b\\c" "x\\y"
 
i cable-into-code preferisco evitarli (come mi avete insegnato qualche 
anno fa)


E quale sarebbe il posto giusto ?
 

 $ bash -x Scrivania/replacing.sh /tmp/test "a\\b\\c" "x\\y"
 
Rimango sempre perplesso quando noto queste cose...
 
Prova queste due linee:
 
echo "a\\b"
 
echo 'a\\b'
 
E dimmi che differenza c'e`...
 
bye,
 
-- 
 
piergiorgio


http://postimg.org/image/klfyab0jb/
 
di meglio non so fare


Il tuo esempio e ok, poi c'è sed di mezzo,occorre tenere conto anche di lui
 
 
Senza provare un:
 
bash -x Scrivania/replacing.sh /tmp/test 'a\\b\\c' 'x\\y'
dovrebbe andare bene.
 


Capisco, prova con i single quote invece che con i double quote
I double quote vengono elaborati dalla shell la quale trasforma \\ in \ 
e poi sed giustamente va in errore.
I single quote non subiscono nessuna elaborazione invece,la stringa 
viene presa cosi come è.
 
 


 
funziona, grazie!!!


non ci avevo pensato; del resto uso bash solo per esigenze personali 
(solo quando serve), non di certo tutti i giorni, quindi di volta in 
volta me lo devo ripassare :)
 


e per fare in modo che vengano visualizzati i file su cui è stata 
eseguita la sostituzione?


un compare tra il vecchio nome ed il nuovo ?
 


Addirittura dovrei fare una copia prima della sostituzione?
 
A limite un
 
ls -R -tr
 
per controllare le date dei file modificati.
 
Ma comunque non sono soluzioni ottimali.

 Ma comunque non sono soluzioni ottimali.
 
Un "grep" prima di "sed". A meno che "sed" non
abbia un opzione "verbose" o simile, che stampi
quello che sta succedendo.
 
bye,
 
-- 
 
piergiorgio

 quello che sta succedendo.
 
È proprio quello che sto cercando
 

 È proprio quello che sto cercando
 
man sed
 
bye,
 
 
-- 
 
piergiorgio


Scusami, non ricordavo bene
Credevo che fosse un rename di file
Comunque con sed per quello che so non si puo sapere se è stata eseguita 
almeno una sostituzione
Per farlo occorre ad esempio un piccolo script perl che legge riga per 
riga e confronti la riga prima con la riga dopo la eventuale 
sostituzione ed imposta un flag se la riga è sostituita
 
 
Le date dei file non le puoi confrontare in quanto anche se non sono 
fatte modifiche sed le cambia lo stesso
 
 

 
 
 
Il comando "t" ?
 
 
-- 
AIOE ³¿³  


E' comunque programmazione,mai usata
Se devo fare qualche modifica appena sopra una sostituzione uso perl
Naturalmente qualunque altro linguaggio decente va bene.