Я читаю RealName от dscl для разных пользователей. В зависимости от пользователя, вывод может быть одним из следующих двух:

RealName: <name>

Или же:

RealName:
 <name>

Поэтому у меня есть sed -e 's|^[RealName:[:space:]]*||g' -e '/^$/d' чтобы получить только <name> в любом случае. Я новичок в регулярных выражениях, поэтому у меня проблемы с объединением двух выражений. Какие-либо предложения? (Просто делаю это для развлечения. Эта команда отлично работает как есть.)

2 ответа2

1

Это не намного короче, но вы могли бы просто сделать

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

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

1
  1. Сопоставьте строку, имеющую только RealName: и пробелы, добавьте следующую строку к пробелу шаблона.
  2. удалить RealName: и перевод строки.
  3. То, что осталось, должно быть <имя>

Поскольку порядок команд имеет значение, следующая команда select-lines, которая соответствует чему-либо ((.*)) В строке, начинающейся с RealName: будет иметь «что-то интересное» после сопоставленного регулярного выражения.

  1. Сопоставьте все остальные строки, начинающиеся с RealName: и сделайте то же самое без перевода строки
  2. удалить пустые строки.

sed -E -e '
  /^RealName:\s*$/{ N; s/RealName:.*\n//  }; 
  /^RealName:(.*)/{ s//\1/  };
  /^$/d
' ~/tmp/RealName

Если команда замены не имеет ничего в поле соответствия, по умолчанию используется регулярное выражение предыдущей команды select-lines.

/hello world/{ s//bye mars/ }    
<=>
/hello world/{ s/hello world/bye mars/ }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .