
Estoy intentando agregar 0 al principio, SI hay un "." en el segundo carácter de esa línea. No podía combinar estos dos;
awk '{ print substr( $0, 2, 1 ) }' file.txt
mostrando el segundo personaje
sed -ie "s/.\{0\}/0/" file.txt
añadiendo un cero al principio.
Debería haber un "si el segundo carácter es un punto".
archivo de muestra:
1.02.2017 23:40:00
10.02.2017 23:40:00
final:
01.02.2017 23:40:00
10.02.2017 23:40:00
Respuesta1
Podemos utilizar cualquiera de sed
o awk
para resolver completamente el problema.
Con sed
:
$ sed 's/^.\./0&/' file.txt
Cuando &
ocurre en la parte de reemplazo del comando de sustitución ( s
), se expandirá a la parte de la línea de entrada que coincide con la parte del patrón del comando.
La expresión regular ^.\.
significa "coincide con todas las líneas que comienzan con ( ^
) un carácter arbitrario ( .
) seguido de un punto literal ( \.
)".
Si la línea es 1.02.2017 23:40:00
, el patrón coincidirá y 1.
será reemplazado 01.
al comienzo de la línea.
Con awk
:
Sobre la base del awk
código parcial en la pregunta...
Esto, como se indicó, imprimirá el segundo carácter de cada línea de entrada:
$ awk '{ print substr($0, 2, 1) }' file.txt
Podemos usar el hecho de que substr($0, 2, 1)
devuelve el segundo carácter y usarlo como condición:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Lo que entra { ... }
es el código que antepone $0
, que es el contenido de la línea actual, con un cero si la condición anterior es verdadera:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Luego solo necesitamos asegurarnos de que todas las líneas estén impresas:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
Por supuesto, la condición substr($0, 2, 1) == "."
también se puede cambiar a una expresión regular (usamos exactamente la misma expresión que usamos en la sed
solución):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Algunas personas que piensan que "cuanto más corto siempre es mejor", lo escribirían como
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(y probablemente también elimine la mayoría de los espacios awk '/^.\./{$0="0"$0}1' file.txt
:)
Respuesta2
Con asiento:
sed -e "/^.\./s/^/0/" file.txt
El patrón /^.\./
busca cualquier carácter y un punto literal al inicio de la línea ^
y, si coincide, s
sustituye ese inicio de línea por un cero, agregando efectivamente el cero al inicio.
El sed expressoin s/.\{0\}/0/
es algo extraño, coincide con cero o más copias de cualquier cosa y lo reemplaza con un cero. Por supuesto, el patrón coincidirá en todas las posiciones de la cuerda, pero como s///
solo reemplaza la primera coincidencia, funciona según lo previsto. Sin embargo, es una forma pintoresca de hacerlo.
O con awk, una expresión regular similar funcionaría para coincidir con la línea, pero podemos usar substr
:
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
Primero probamos si el segundo carácter es un punto y luego agregamos un cero al frente de la línea si es así. El último invoca la acción predeterminada de imprimir la línea después de cualquier modificación.
Respuesta3
Dijiste awk y sed, pero parece que estás intentando formatear una fecha y para eso usaría el date
comando. Por ejemplo:
echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d
saldrá
01.02.2017 23:40:00
El sed
comando en el medio cambia los puntos a barras para ingresar date -d
. Las opciones de formato permiten la salida en casi cualquier formato que desee. En %m
particular, pondrá a cero el mes, que es lo que parece que estás intentando hacer.
Como señala Kusalananda:
Aún más compacto (fecha GNU y Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
Respuesta4
Con sed podría ser
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
Esto se utilizará ^
para anclar al principio de la línea, luego capturará cualquier carácter individual de un grupo, seguido de un literal .
y luego cualquier otra cosa. Si coincidimos, imprimimos a 0
, luego nuestro primer grupo de captura (el carácter al comienzo de la línea), luego a y .
luego nuestro segundo grupo de captura (el resto de la línea).