sed з множинним виразом для міркування на місці


24

Я намагаюся замінити кілька слів у файлі, використовуючи sed -i #expression1 #expression2

файл

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Вихід (бажаний)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Випробування

Я можу отримати наступний вихід, використовуючи sed -i2 рази.

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Чи можу я зробити будь-який можливий спосіб зробити це як єдину на місці команду, як

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Коли я спробував вище код, він приймається s/item/stuff/gяк файл і спробуйте над ним працювати.


Якщо ваші файли схожі на наведений вище приклад (тобто вони дотримуються тієї ж схеми), ви можете зробити це за допомогою однієї заміни:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Відповіді:


26

Залежно від версії sedвашої системи ви можете це зробити

sed -i 's/Some/any/; s/item/stuff/' file

Вам не знадобиться gпісля остаточного прорізу в sкоманді тут, оскільки ви робите лише одну заміну на рядок.

Як варіант:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

-iОпція вказує sedредагувати файли на місці; якщо є символи одразу після -iцього, sedстворює резервну копію вихідного файлу і використовує ці символи як розширення файлу резервної копії. Наприклад,

sed -i.bak 's/Some/any/; s/item/stuff/' file

або

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

буде змінено file, зберігаючи оригінал до file.bak.

Звичайно, в системі Unix (або Unix-подібній) ми зазвичай використовуємо '~', а не '.bak',

sed -i~ 's/Some/any/;s/item/stuff/' file

2
Зауважте, що ви описуєте варіант GNU. Варіант BSD (як у FreeBSD або OS / X) вимагає аргументу для -i. Так sed -i '' 's/a/b/;s/c/d/' fileчи sed -i .back 's/a/b/;s/c/d/'або sed -i.back 's/a/b/;s/c/d/'там. Інші sedреалізації зазвичай не підтримують -i.
Стефан Шазелас

Дякую @ StéphaneChazelas за уточнення цього. І я думаю, я мав би бути більш чітким, кажучи, що в GNU sed не може бути пробілу між -iі розширенням.
PM 2Ring

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpРезультати sed: -e expression #1, char 141: unterminated s 'команда'
alhelal

@alhelal Вибачте, коментарі не є правильним місцем для запитань. Але все одно у вашій останній sкоманді відсутня її остаточна команда /.
PM 2Ring

@ PM2Ring, як я не помітив, що я здогадався, це пов'язане з вашим рішенням. Однак, дякую.
alhelal

10

Ви можете зв'язати вирази sed разом із ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

Множинне вираження з використанням декількох -eваріантів:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

або ви можете використовувати лише один:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Ви повинні дати розширення для резервного файлу, оскільки коли деяка реалізація sed, як-от OSX sed , не працює з порожнім розширенням (Ви повинні використовувати, sed -i ''щоб замінити вихідні файли).


1

Ви можете використовувати Vim в режимі Ex:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % виберіть усі рядки

  2. s замінник

  3. x зберегти і закрити

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