@sedit era sulla strada giusta, ma è un po 'scomodo per definire una variabile.
Solution (bash specifico)
Il modo per farlo in bash è quello di utilizzare mettere un simbolo del dollaro di fronte al vostro singola stringa tra apici.
$ echo -e '1\n2\n3'
1
2
3
$ echo -e '1\n2\n3' | sed 's/.*/\t&/g'
t1
t2
t3
$ echo -e '1\n2\n3' | sed $'s/.*/\t&/g'
1
2
3
Se la stringa deve includere l'espansione variabile, è possibile ma citato stringhe in questo modo:
$ timestamp=$(date +%s)
$ echo -e '1\n2\n3' | sed "s/.*/$timestamp"$'\t&/g'
1491237958 1
1491237958 2
1491237958 3
Spiegazione
In bash $'string'
cause "espansione ANSI-C". E questo è ciò che la maggior parte di noi si aspettano quando usiamo le cose come \t
, \r
, \n
, ecc Da: https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting
Parole del modulo $ 'stringa' sono trattati in modo speciale. La parola espande a stringa, con caratteri di escape rovesciato sostituiti come specificato da lo standard ANSI C. sequenze di escape backslash, se presenti, sono decodificati ...
Il risultato espanso è unico citato, come se il simbolo del dollaro non era presente.
Solution (se si deve evitare di bash)
io personalmente che la maggior parte gli sforzi per evitare bash sono stupido perché evitando bashismi NON * rendere il codice portabile. (Il tuo codice sarà meno fragile se lo condividi su bash -eu
se cerchi di evitare bash e usare sh
[a meno che tu non sia un assoluto POSIX ninja]). Ma piuttosto che avere un argomento religioso a riguardo, ti darò solo la migliore risposta *.
$ echo -e '1\n2\n3' | sed "s/.*/$(printf '\t')&/g"
1
2
3
* MIGLIORE risposta? Sì, perché un esempio di ciò che la maggior parte degli script di shell anti-bash farebbe male nel loro codice è usare echo '\t'
come in @robrecord's answer. Questo funzionerà con GNU echo, ma non con BSD echo. Ciò si spiega con il Gruppo Aperto a http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37_16
Come sed può variare tra le piattaforme (in particolare, BSD/MacOSX rispetto a Linux), può essere utile specificare la piattaforma su cui si sta utilizzando sed. – Isaac
@Isaac, questo era su Solaris – sixtyfootersdude
sed "s/\ (. * \)/# \ 1 /" $ nomefile | tr '#' '\ t'> $ sedTmpFile && mv $ sedTmpFile $ nomefile. – user2432405