2016-01-07 42 views
6

Ho un file di testo in cui voglio sostituire una stringa con una nuova stringa, quindi aggiungere o rimuovere spazi per renderli identici. Per esempio, io voglio sostituiresed - sostituire la stringa con lo stesso numero di caratteri

string    .10 

con

longer_string  .10 

In sostanza ho bisogno di sostituire 'stringa', e quindi avere la' .10' nella colonna corretta, regarldess del numero di caratteri nella stringa di sostituzione.

+0

Ciao @ ericvb86 intendi qualcosa come questo 'sed -e 's/string/long_string/g' file.txt'? –

+0

è possibile utilizzare la sostituzione di uno script di edim o vim per farlo altrimenti si crea uno script indipendentemente dalle dimensioni della stringa di sostituzione che corrisponde alla dimensione della stringa in modo che corrisponda/sostituisca gli spazi necessari indipendentemente dalla dimensione del diff. – alexscott

+0

Risposta di re alexscott: sì, stavo per dire che questo sembra più un lavoro per vi/vim che sed. Cerca stringa ('/^stringa'), vim-replace con stringa più lunga (' Rlonger-string '). Non conosco il codice esatto di vimscript per questo; avresti bisogno di ricercare: https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script. –

risposta

1

È possibile utilizzare sed per eseguire la sostituzione e quindi riallineare le colonne con column?

cat input.txt | sed 's/string/longer_string/g' | column -t 
+1

Note 'cat file | sed' ha un UUoC. Meglio il file 'sed' ... '. – fedorqui

+0

Cos'è l'UFLA?Personalmente, mi piacciono gli esempi illustrativi per scorrere da sinistra a destra :) –

+0

Non sai quale sia l'UFLA: D L'UUoC è http://porkmail.org/era/unix/award.html:) – fedorqui

1

È possibile stampare la riga e aggiungere un ritorno a capo; quindi, stampare la nuova linea:

while IFS= read -r line; 
do 
    echo -ne "$line\r" 
    echo -ne "longer_string" 
done < file 

Quindi nel tuo file, sarebbe:

$ while IFS= read -r line; do echo -ne "$line\r"; echo -ne "longer_string"; done < file 
longer_string  .10 

Nota questo funziona bene se la stringa di sostituzione è più lunga di quella originale. Per il contrario, potremmo aver bisogno di fare qualche passo in più.

0

Sed è lo strumento sbagliato per il lavoro qui.

Quello che vi serve è:

  1. Split le parole su cui lavorare ("stringa" &" .10") e memorizzarli in variabili
  2. Trovare la lunghezza della componente più a sinistra
  3. Modifica "stringa"
  4. Stampa le stringhe modificate nelle colonne a larghezza fissa

ecco qui:

# 1 
str="string    .10" 
a=$(echo "$str" | awk '{print $1}') 
b=$(echo "$str" | awk '{print $2}') 

# 2 
# note the use of `echo -n` to avoid n+1 errors with `wc`. It does not change anything here because we're subtracting anyway, but if you play around it might bite you. 
str_length=$(echo -n "$str" | wc -c) 
b_length=$(echo -n "$b" | wc -c) 
leftmost_length=$(($str_length - $b_length)) 

# 3 
a="longer_${a}" 

# 4 
printf "%-${leftmost_length}s %-10s\n" "$a" "$b" 
# longer_string  .10 
0

Questo potrebbe funzionare per voi (GNU SED):

sed -r 's/string(.*)/\nlonger_string\1\n&/;ta;:a;s/\n(\S)(.*\n)./\1\n\2/;ta;s/\n.*\n(.*)/\1/' file 

Questo sostituisce string con longer_string e quindi aggiunge la linea originale a quello aggiornato (a capo vengono anteposti ai vecchi e nuovi archi) . Quindi i caratteri vengono rimossi dalla riga aggiunta fino alla fine della nuova stringa. Gli spazi (meno la nuova riga introdotta) dalla vecchia riga sostituiscono quindi il resto della riga modificata.