Как отобразить подстроку из вывода канала?

Другой однострочник perl:

perl -pe 's/\|0+(?=\d)/|/g if /^T\|/;'

Вышеупомянутое переведет T | 00 | и T | 00.00 | в T | 0 | и T | 0.00 | соответственно.

2
11.05.2018, 18:38
3 ответа

${string:offset:length}es un operador de expansión de parámetros que se expande al rango de caracteres en la variable $string.

Para obtener un rango de bytes de la entrada (y eso también se aplicaría a caracteres de un solo -byte ), puede usar:

func | tail -c +12 | head -c 5

para obtener 5 bytes comenzando con el 12 (1 -compensaciones basadas ). La opción -ca headno es estándar pero es bastante común.

Tenga en cuenta que funcpuede eliminarse en algún momento después de que haya generado su byte 16, ya que headsaldrá después de haber generado esos 5 bytes, y tailsería eliminado si intenta escribir más datos después de eso, que se extendería a func.

También puedes hacer:

func | dd bs=1 skip=11 count=5 2> /dev/null

2> /dev/nulles para evitar el mensaje de estado al final. Sin embargo, eso suprime todos los errores. Con GNU dd, puede reemplazarlo con status=nonepara suprimir solo el estado.

Para valores grandes de length, eso sería menos eficiente ya que lee un byte a la vez. Con GNU ddnuevamente, puede evitar eso haciendo:

func | dd iflag=count_bytes,skip_bytes,fullblock skip=11 bs=64k count=5M status=none

Lo que haría tantas lecturas de hasta 64KiB cada una para obtener 5MiB bytes de datos.

Ahora, para que el desplazamiento y la longitud se expresen en caracteres (uno o varios -bytes )en lugar de bytes, eso se vuelve más complicado.

Una opción es almacenar toda la salida en una variable y usar el ${var:offset:length}operador como otros han mostrado . Aunque eso significa almacenar toda la salida en la memoria. Usar var=$(func)también significa que los caracteres finales de nueva línea se descartan.

Otra opción es usar bash's read -Nque lee un número dado de caracteres:

func | {
  IFS= read -rN 11 discarded
  IFS= read -rN 5 data
  printf '%s\n' "$data"
}

O conperl(un poco más eficiente para grandes datos):

func | perl -Mopen=locale -sne '
  BEGIN{$total = $o + $n; $/ = \$total}
  print substr($_, $o); exit' -- -o=10000 -n=5000000
4
27.01.2020, 21:50
string="$(func)"
echo "${string:12:5}"
2
27.01.2020, 21:50

Respuesta

Si solo desea extraer la salida de some_func, no necesita almacenarla en una variable, simplemente puede enviar la salida a cutque extraerá los caracteres solicitados:

some_func | cut -c 12-16  

Explicación

cutTomará el stdiny extraerá el rango solicitado en función de las opciones especificadas.

-cSignifica que el rango se especifica en caracteres.

12-16Rango en el que los caracteres comienzan con índice 1, no 0.
Por lo tanto, esto tomará caracteres en la posición 12, 13, 14, 15y 16.

Como me quedó Stéphane Chazelas , tenga en cuenta que esto funcionará para cada línea de entrada, no solo para la primera línea.

4
27.01.2020, 21:50

Теги

Похожие вопросы