соответствие шаблону sed, остановка на первом найденном символе - PullRequest
0 голосов
/ 27 апреля 2020

Возьмите строку "hello_world 1 2 3"

Я хочу, чтобы вывод был "hello_world"

Моя попытка "s / \ (. * \). * / \ 1 / g "

Но я получаю" hello_world 1 2 "

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

I хотите взять любую длину символов \ (. * \) с последующим пробелом '' и удалить все, что следует после него. *

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Не могли бы вы попробовать следующее.

echo "hello_world 1 2 3" | sed 's/\([^ ]*\).*/\1/'

Объяснение выше:

Использование sed возможности хранения совпавших регулярное выражение во временный буфер. К которым позже могут обращаться переменные типа 1, 2 и т. Д. (В зависимости от количества буферов, которые вы упоминаете).

Здесь мы собираем все до появления первого пробела в 1-м временном буфере а затем сохранить все как есть .*. При подстановке мы упоминаем \1, что означает замену значения всей строки первым согласованным / сохраненным значением 1-го временного буфера (который равен hello_world).

Почему код OP не работает: Поскольку OP использует .*, который является жадным регулярным выражением и захватывает всю строку в 1-м буфере, поэтому при его использовании \1 там печатается целая строка.

0 голосов
/ 27 апреля 2020

Это может сработать для вас (GNU sed):

sed 's/\s.*//' file

Соответствует первому пробелу и всему последующему и удаляет его, оставляя все, что находится перед, то есть все непробельные символы.

То же, что и:

sed 's/^(\S+).*/\1/' -E file
...