@sedit estaba en el camino correcto, pero es un poco incómodo para definir una variable.
Solución (bash específica)
La manera de hacer esto en bash es el uso de poner un signo de dólar en frente de la cadena de comillas simples.
$ 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
Si la cadena tiene que incluir la expansión de variables, se puede, pero citado cadenas juntas de esta manera:
$ timestamp=$(date +%s)
$ echo -e '1\n2\n3' | sed "s/.*/$timestamp"$'\t&/g'
1491237958 1
1491237958 2
1491237958 3
Explicación
En bash $'string'
causas "expansión ANSI-C". Y eso es lo que la mayoría de nosotros esperamos cuando usamos cosas como \t
, \r
, \n
, etc. Desde: https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting
palabras de la forma $ 'cadena' se trata especialmente. La palabra se expande a cadena, con caracteres de escama invertida reemplazados según lo especificado por el estándar ANSI C. Las secuencias de escape de barra invertida, si están presentes, son decodificadas ...
El resultado ampliado es una comilla simple, como si el signo de dólar no tuviera estado presente.
solución (si se debe evitar bash)
personalmente que la mayoría de los esfuerzos para evitar fiesta son tontos porque evitando bash NO * hacer que su código portable. (Tu código será menos frágil si lo cambias a bash -eu
que si tratas de evitar bash y usas sh
[a menos que seas un ninja POSIX absoluto].) Pero en lugar de tener un argumento religioso sobre eso, solo te daré la MEJOR * respuesta.
$ echo -e '1\n2\n3' | sed "s/.*/$(printf '\t')&/g"
1
2
3
* ¿RESPUESTA METIL? Sí, porque un ejemplo de lo que la mayoría de los scripters de shell anti-bash harían mal en su código es usar echo '\t'
como en @robrecord's answer. Eso funcionará para eco de GNU, pero no para eco de BSD. Esto se explica por The Open Group en http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37_16
Como SED puede variar entre plataformas (en particular, BSD/MacOSX frente Linux), puede ser útil especifica la plataforma en la que estás usando sed. – Isaac
@Isaac, esto fue en Solaris – sixtyfootersdude
sed "s/\ (. * \)/# \ 1 /" $ filename | tr '#' '\ t'> $ sedTmpFile && mv $ sedTmpFile $ nombre de archivo. – user2432405