Я не можу знайти жодної документації про 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
?