Если вам нужно, это вызвать gunzip
для каждого файла с именем
, заканчивающимся на . gz
в любом месте вашего текущего каталога, это должно сделать
это:
find . -type f -name '*.gz' exec gunzip {} +
Более общий способ превратить то, что находится на стандартном вводе, в аргументы команды - использовать xargs, но есть несколько ошибок, о которых следует помнить при использовании этой команды.
sed -r '/^[[:blank:]]*range[[:blank:]]+/ {
s/// # delete the previous match, "range"
s/;.*//
s/[[:digit:]]+\.//g # remove digits followed by dot
s/[[:blank:]]+/-/
s/^/IP range is: /
}' <<END
range 1.1.1.10 1.1.1.100;
END
IP range is: 10-100
Tu problema tiene que ver con la codicia de .*
. Todavía puedes hacerlo en sed
, pero es más fácil con Perl:
$ echo 'range 1.1.1.10 1.1.1.100;' | perl -ne 'printf("IP range is %d-%d\n", (/\.(\d+)[^.]/g))'
IP range is 10-100
El script de Perl compara los números al final de las direcciones IP y los devuelve como dos números enteros que se usan en printf()
para imprimir la cadena de salida formateada.
La expresión regular de Perl
/\.(\d+)[^.]/g
capturará cada conjunto de dígitos precedidos por un punto, pero no seguidos por un punto.
En sed
realmente no tienes que hacer la sustitución de una sola vez:
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/'
range 1.1.1.10 100
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/' -e 's/[^ ]*\.([0-9]+) /\1-/'
range 10-100
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/' -e 's/[^ ]*\.([0-9]+) /\1-/' -e 's/range/IP & is/'
IP range is 10-100
El guión final sed
:
s/[^ ]*\.([0-9]+);/\1/; # Isolate last number in range
s/[^ ]*\.([0-9]+) /\1-/; # Isolate first number in range, add dash
s/range/IP & is/; # Sort out text at start
Que, después de la inspección, se puede reducir a
s/[^ ]*\.([0-9]+)[^.]/-\1/g
s/range -/IP range is /
Eso es
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+)[^.]/-\1/g' -e 's/range -/IP range is /'
IP range is 10-100
$ echo ' range 1.1.1.10 1.1.1.100;' |
sed -Ene 's/^[[:blank:]]*range [0-9.]*\.([0-9]+) [0-9.]*\.([0-9]+);.*/IP range is: \1-\2/p'
IP range is: 10-100
en partes:
^[[:blank:]]* any blanks at start of line
[0-9.]*\. numbers and dots, ending with a dot
([0-9]+) capture the following numbers
[0-9.]*\.([0-9]+) same, again
\1 and \2 put back the captured groups
s///p print if the substitution matched
Con gnu sed sin control de la validez de la línea
sed -E 's/.*\.(\S+)\s+.*\.(\S+);.*/IP range is: \1-\2/'