Сед не меняет весь шаблон в нижнем коде

Я пытаюсь использовать sed сегодня, и у меня есть быстрый вопрос. Почему ниже код не меняет все «день»?

echo 'day night day' | sed 's/day/night/'

Выход:

ночной день

Но я думал, что он изменит все «day» s Пожалуйста, помогите мне понять, как это сделать и почему это не изменило это. Спасибо

1
задан 14 February 2018 в 03:54

4 ответа

По умолчанию sed не является «жадным». Если ваше регулярное выражение «s / day / night / g», то ваш выход будет «ночной ночью», который, я думаю, вы хотите.

0
ответ дан 17 July 2018 в 20:52

Чтобы сделать несколько замен в одной строке, вы должны добавить флаг g (глобальный):

$ echo 'day night day' | sed 's/day/night/g' night night night

Вы также можете использовать номер вместо g, чтобы заменить только числоth instance:

$ echo 'day night day night day' | sed 's/day/night/2' day night night night day

Как указано в документации GNU sed:

Примечание: в стандарте POSIX не указывается, что должно произойти, когда вы смешиваете модификаторы g и number и в настоящее время не является широко согласованным значением в реализациях sed. Для GNU sed взаимодействие определяется как: игнорировать совпадения до числаth, а затем сопоставлять и заменять все совпадения с numberth on.

Поскольку Ubuntu использует GNU sed, это действительно то, как он себя ведет:

$ echo 'day night day night day' | sed 's/day/night/2g' day night night night night
1
ответ дан 17 July 2018 в 20:52

По умолчанию sed не является «жадным». Если ваше регулярное выражение «s / day / night / g», то ваш выход будет «ночной ночью», который, я думаю, вы хотите.

0
ответ дан 23 July 2018 в 21:32
  • 1
    Жадность действительно является свойством операторов повторения ИМХО - в этом смысле (как я полагаю), sed, безусловно, является жадным по умолчанию - например, echo 'day night day' | sed 's/.*day/night/' заменит все к и включая последний экземпляр day. Perl (который также является жадным по умолчанию) предоставляет нежелезный модификатор, например. perl -pe 's/.*?day/night/' заменит только первый day – steeldriver 14 February 2018 в 04:12
  • 2
    Справедливая точка зрения о моем неосторожном использовании «жадных». Во всяком случае, дело в том, что регулярное выражение только одно время совпало; вам нужно сказать это, если вы хотите совместить несколько раз. – Andrew Sullivan 15 February 2018 в 02:03

Чтобы сделать несколько замен в одной строке, вы должны добавить флаг g (глобальный):

$ echo 'day night day' | sed 's/day/night/g' night night night

Вы также можете использовать номер вместо g, чтобы заменить только числоth instance:

$ echo 'day night day night day' | sed 's/day/night/2' day night night night day

Как указано в документации GNU sed:

Примечание: в стандарте POSIX не указывается, что должно произойти, когда вы смешиваете модификаторы g и number и в настоящее время не является широко согласованным значением в реализациях sed. Для GNU sed взаимодействие определяется как: игнорировать совпадения до числаth, а затем сопоставлять и заменять все совпадения с numberth on.

Поскольку Ubuntu использует GNU sed, это действительно то, как он себя ведет:

$ echo 'day night day night day' | sed 's/day/night/2g' day night night night night
1
ответ дан 23 July 2018 в 21:32
  • 1
    Спасибо. Я думаю, что это не изменилось, потому что sed ориентирован на линию. – Christiano 14 February 2018 в 03:58
  • 2
    @ChristianoMoshar Вы правы на этом. [F1] выполнит их все, но если вы хотите изменить только последний, это будет echo 'day night day' | sed 's/day$/night/', где $ после слова означает применение к последнему совпадению. Если вы хотите выполнить только первое совпадение, оставьте его таким, каким он есть по умолчанию. – Terrance 14 February 2018 в 04:15

Другие вопросы по тегам:

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