Использование sed для редактирования строки, состоящей из двух строк

Вы можете использовать ctrl + alt + F1 ... F7 , чтобы перейти на другой терминал и войти оттуда. Вы также можете использовать ctrl + z или ctrl + c . Однако, если кто-то пытается украсть ваш логин и пароль с помощью этого метода, возможно, вас обманывают. Зависит от того, какую ОС вы используете, у кого был к ней доступ и какой у него был доступ.

Как правило, вы никогда не можете быть уверены на 100%, но если бы кто-то сделал это, я бы предположил, что у него уже есть root-доступ, поэтому ваши данные для входа будут для него бессмысленными.

3
20.02.2018, 08:22
2 ответа

Probé su script con GNU sedy produjo el resultado esperado. Sin embargo, esto no es transferible a otras versiones sed, ya que usa \ndentro de []y en el reemplazo, que no está definido por el estándar.

Usarlo en el reemplazo se puede evitar fácilmente:

sed -e '1h;2,$H;$!d;g' -e 's/\(macroa{\([a-z]*\) [^\n]*\)\(\nmacrob{\)\2 /\1\3/g'

Para usarlo en la expresión []se puede hacer con un truco --usa el comando ypara intercambiar la nueva línea con un carácter normal antes del reemplazo y volver a cambiarlo después; en este caso uso|:

sed -e '1h;2,$H;$!d;g' -e 'y/\n|/|\n/;s/\(macroa{\([a-z]*\) [^|]*\)\(|macrob{\)\2 /\1\3/g;y/\n|/|\n/'

Esta es la solución universal, sin embargo creo que es feo. En la mayoría de los casos, en lugar de [^\n], puede escribir [[:print:]], porque normalmente todo el código, excepto las líneas nuevas, consta de caracteres imprimibles, por lo que es:

sed 'H;1h;$!d;g;s/\(macroa{\([a-z]*\) [[:print:]]*\)\n\(macrob{\)\2 /\1\n\3/g'

(También simplifiqué su inicial 1h;2,$Ha H;1h.)

Teniendo en cuenta el comentario de don _crissti, agrego que el enfoque típico para resolver este tipo de Problema es el N;P;Dciclo :Siempre agregue la línea Next, procese ambos juntos,Pimprime la primera línea y Delimínala del espacio del patrón para continuar con la segunda:

sed 'N;s/\(macroa{\)\([a-z]* \)\(.*\nmacrob{\)\2/\1\2\3/;P;D'
3
27.01.2020, 21:18

Si está de acuerdo con usar awken lugar desed

$ awk -F'[{ ]' 'c && c-- && $1=="macrob" && $2==s{sub(s" ", "")}
                $1=="macroa"{c=1; s=$2} 1' ip.txt
macroa{abc def 123 ghi}
macrob{123 xyz}
  • -F'[{ ]'use {o un carácter de espacio como separador de campo
  • $1=="macroa"{c=1; s=$2}si el primer campo es macroa, inicialice el contador con 1y guarde el segundo campo en una variable. El contador determina qué líneas siguientes deben verificarse
  • c && c--esto será cierto siempre que el contador no sea -cero. Dado que c=1en este caso, solo una vez que esto sea cierto e independientemente de otras condiciones, el contador se convertirá en cero. Entonces, solo las líneas consecutivas pueden coincidir
  • $1=="macrob" && $2==scondición requerida
    • sub(s" ", "")eliminar la cadena y un carácter de espacio
  • Lecturas adicionales:Imprimir con sed o awk una línea siguiendo un patrón coincidente
1
27.01.2020, 21:18

Теги

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