Mesclar duas expressões sed separadas em uma?

0

Estou lendo o RealName de dscl para vários usuários. Dependendo do usuário, a saída pode ser uma das duas seguintes:

RealName: <name>

Ou:

RealName:
 <name>

Portanto, eu tenho sed -e 's|^[RealName:[:space:]]*||g' -e '/^$/d' para obter apenas o <name> em ambos os casos. Sou novo em expressões regulares, por isso estou tendo problemas para mesclar as duas expressões. Alguma sugestão? (Apenas fazendo isso por diversão. Esse comando funciona muito bem como está.)

    
por 2rs2ts 16.07.2013 / 19:59

2 respostas

1
  1. Corresponder uma linha que tenha apenas RealName: e espaços, anexe a linha Próximo ao espaço de padrão.
  2. remova o nome real e a nova linha.
  3. O que resta, deve ser < name >

Como a ordem dos comandos é importante, o próximo comando de linhas de seleção que corresponde a qualquer coisa ( (.*) ) em uma linha que começa com RealName: terá "algo interessante" após a regex correspondente.

  1. Corresponda todas as outras linhas que começam com RealName: e faça o mesmo sem novas linhas
  2. excluir linhas vazias.
sed -E -e '
  /^RealName:\s*$/{ N; s/RealName:.*\n//  }; 
  /^RealName:(.*)/{ s///  };
  /^$/d
' ~/tmp/RealName

Se o comando substituto não tiver nada no campo de correspondência, o padrão é o regex do comando das linhas de seleção anteriores.

/hello world/{ s//bye mars/ }    
<=>
/hello world/{ s/hello world/bye mars/ }
    
por 16.07.2013 / 23:32
1

Não é muito mais curto, mas você pode fazer

sed -e 's|^[RealName:[:space:]]*||g;/^$/d'

o ponto-e-vírgula faz dele uma expressão separada, mas você realmente quer pegar um padrão de múltiplas linhas, que provavelmente não é tão bom quanto o que você tem aqui, mas este é um bom recurso.

    
por 16.07.2013 / 21:01

Tags