SED - Удалить все цифры перед каждым экземпляром точек

Если вам нужно, это вызвать gunzip для каждого файла с именем , заканчивающимся на . gz в любом месте вашего текущего каталога, это должно сделать это:

find . -type f -name '*.gz' exec gunzip {} +

Более общий способ превратить то, что находится на стандартном вводе, в аргументы команды - использовать xargs, но есть несколько ошибок, о которых следует помнить при использовании этой команды.

0
04.06.2018, 21:37
4 ответа
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
0
28.01.2020, 02:31

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 sedrealmente 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
1
28.01.2020, 02:31
$ 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 
0
28.01.2020, 02:31

Con gnu sed sin control de la validez de la línea

sed -E 's/.*\.(\S+)\s+.*\.(\S+);.*/IP range is: \1-\2/'
1
28.01.2020, 02:31

Теги

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