Я не можу знайти жодної документації про sed -eвимикач, для простої заміни мені це потрібно?
напр
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Я не можу знайти жодної документації про sed -eвимикач, для простої заміни мені це потрібно?
напр
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Відповіді:
На чоловіковій сторінці:
-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.
-e
Це може допомогти вам:
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
-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?
У довідці 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
man sed?