Поиск совпадений многострочного регулярного выражения в файлах (без pcregrep)

Проблема здесь в том, что по умолчанию это:

ip addr add 10.0.0.1 dev eth0

Установите маску подсети / 32 , что означает, что в подсети не может быть других узлов, и пытается установить маршрут там с помощью через ничего не значило.

Использование явной, более разумной маски:

ip addr add 10.0.0.1/24 dev eth0

Решает проблему; поочередно см. ответ Джофеля.

0
11.06.2018, 12:29
3 ответа

Las herramientas de Unix suelen estar orientadas a líneas -y, por lo tanto, no hay forma de aplicar una expresión regular a varias líneas de entrada utilizando la caja de herramientas estándar.

sedse puede hacer para procesar el archivo de tal manera que pueda detectar las líneas que está buscando, pero hacemos esto estrictamente usando operaciones en líneas individuales:

$ sed -n '/^Text/{N;/^Text\nLine/=;D;}' file
10

Este script sedbusca la cadena Textal comienzo de una línea. Cuando lo encuentra, agrega la siguiente línea a su búfer con un \nen -en medio.

Si el búfer ahora coincide con ^Text\nLine, entonces el número de línea actual se genera usando el comando =en sed. El número de línea generado es el de la línea Lineen el archivo.

Tenga en cuenta que, si bien la segunda expresión regular parece coincidir en una nueva línea del archivo, no es así. Coincide con una nueva línea en su búfer interno, que colocamos allí usando el comando Ncuando leemos la siguiente línea del archivo.

Probablemente usaría esto en un bucle si desea aplicarlo a varios archivos:

for name in pattern; do
    printf 'Processing %s...\n' "$name"
    sed -n '/^Text/{N;/^Text\nLine/=;D;}' "$name"
done

donde patternsería un patrón de globbing de nombre de archivo ordinario que coincide con los archivos que le interesan.

2
28.01.2020, 02:23

Si vimestá instalado, puede usarlo en el modo excomo:

vim -e -s -c 'argdo g/^Text\nLine/#' -c q./*.txt

Ver también el comando zpara dar contexto.

vim -e -s -c 'argdo g/^Text\nLine/z#.5' -c q./*.txt

Sin embargo, eso no imprime los nombres de los archivos. Un enfoque no muy eficiente perlpodría ser:

perl -l -0777 -ne 'while (/Text\nLine/g) {
   print "$ARGV, line ". ++(() = $` =~ /\n/g)}'./*.txt
1
28.01.2020, 02:23
 perl -ne 'eof and $. = 0 or /^Text/ && ($_.= <>) =~ /^Line/m && print "$ARGV: $.\n"'./*

Esto imprimirá el nombre del archivo junto con el número de línea donde ocurrió la coincidencia.

Además, el contador de línea ($. )se restablece al llegar a eof de cada archivo.

0
28.01.2020, 02:23

Теги

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