Яке призначення команди -e in sed?


41

Я не можу знайти жодної документації про sed -eвимикач, для простої заміни мені це потрібно?

напр

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
Ви впевнені, що цього не знайшли man sed?

4
Ви не знайдете пояснень potongs, чому б не використати "cmd1; cmd2"
користувачеві невідомо

Відповіді:


28

На чоловіковій сторінці:

-e script, --expression=script

    add the script to the commands to be executed

Таким чином, ви можете використовувати кілька -eваріантів, щоб створити сценарій з багатьох частин.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Буде чи перший замінити fooз , barа потім видалити кожен рядок , що містить FOO.


3
Отже, вам не потрібно "-e", якщо у вас є лише один сценарій, правда?
JohnyTex

Я теж шукаю справжню мету-e
typelogic

27

Це може допомогти вам:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

У кожному випадку команди i(вставити), a(додати) та c(змінити) команди повинні бути завершені новим рядком.

Зазвичай команди можуть бути розділені, ;наприклад, /foo/d;/bar/dі згруповані по {...}, наприклад, /foo/{h;d}але для i,a,cкоманд -eпередбачений спосіб розділення команд.

Альтернативою є використання оболонки (bash) для вставки нового рядка:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
Принаймні в деяких реалізаціях sed (наприклад, у FreeBSD) вам також потрібно закінчити мітки та команди гілок за допомогою нових рядків / -e, а не крапками з комою. Це не буде працювати: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Але це буде:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
сумнівним

Я не впевнений, наскільки тут потрібна must be terminated with a newlineфраза. Коли я тестував тут в моєму cygwin, це працює: sed '/foo/i\bar' file. Отже, тепер, коли ми можемо об'єднати окремі вирази в одне, це знову виникає до початкового питання: Яка справжня мета -e?
typelogic

1

-e, що еквівалентно --expression, необов'язково, якщо ви не нанизуєте кілька виразів разом (не є загальним), як показано в іншому відповіді .

Убік: ;замість цього ж виразу можна використовувати кілька виразів один за одним.


0

У довідці sedви знайдете, що -eпрапор означає:

 -e script, --expression=script
                 add the script to the commands to be executed

Але ви не перший, хто плутається після зустрічі -e. У вашому прикладі sed 's/foo/bar/'і sed -e 's/foo/bar/'рівнозначні. В обох випадках s/foo/bar/це сценарій, який виконується sed. Другий варіант є більш явним, але це, мабуть, не причина, яку ви часто бачите -eвикористаною. Причиною цього є те, що -eдає можливість використовувати більше одного сценарію з тим самим викликом sed. Це все ще залишає питання, навіщо використовувати його, якщо ви використовуєте лише один сценарій? Наступний приклад може пояснити це:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

Виведе "foo".

Однак,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

не вдасться, оскільки тепер sedтрактує перше s/foo/barяк ім'я файлу. Отже, щоб полегшити вам життя у майбутньому, ви вже можете почати використовувати -eпрапор вже сьогодні. Таким чином, у майбутньому ви можете просто додати команду додатковим сценарієм, використовуючи -e <script>.

Примітка. В інших відповідях, ;пропонованих як альтернатива для використання декількох сценаріїв, пропонується. Хоча технічно це можливо в деяких випадках, це не рекомендується, оскільки це швидко призводить до дуже важкого для читання коду. Дивіться приклад тут: https://www.grymoire.com/Unix/Sed.html#uh-61

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.