Sed не змінює весь малюнок у наведеному нижче коді


1

Я сьогодні намагаюся використовувати sed, і у мене є швидке запитання. Чому наведений нижче код не змінює весь день?

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

Вихід:

нічний нічний день

Але я думав, що це змінить усі "дні". Будь ласка, допоможіть мені зрозуміти, як це зробити, і чому це не змінилося. Дякую

Відповіді:


1

Щоб зробити кілька замін в одному рядку, потрібно додати gпрапор (глобальний):

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

Ви також можете використовувати число замість, gщоб замінити лише числовий екземпляр:

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

Як зазначено в документації GNU sed :

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

Оскільки Ubuntu використовує GNU sed, так воно і поводиться:

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

Дякую. Я думаю, що це не змінилося, тому що sed орієнтована на лінію.
Крістіано

@ChristianoMoshar Ви праві на цьому. gРобитиме їх все, але якщо ви хочете змінити тільки останній було б echo 'day night day' | sed 's/day$/night/' де $після слова означає , що відносяться до останнього матчу. Якщо ви хотіли провести лише перший матч, залиште його таким, яким він є, як і за замовчуванням.
Терранс

0

За замовчуванням sed не є "жадібним". Якщо ваш регулярний вираз є "s / day / night / g", то вашим результатом буде "ніч на ніч", яку я думаю, ви хочете.


Жадібність насправді є властивістю операторів повторення IMHO - в цьому сенсі (який я вважаю звичайним, я, sedзвичайно, є жадібним за замовчуванням - наприклад echo 'day night day' | sed 's/.*day/night/', замінить все до останньої інстанції, включаючи day. Perl (який також є жадібним за замовчуванням) надає не жадібний модифікатор, наприклад perl -pe 's/.*?day/night/'замінить лише першийday
steeldriver

Справедлива думка про моє недбале використання «жадібних». У будь-якому разі, справа в тому, що регулярний вираз збігався лише один раз; вам потрібно сказати, якщо ви хочете відповідати більше, ніж один раз.
Ендрю Салліван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.