Як розділити вираз довгих sed на кілька рядків?


15
sed 's/[long1][long2]/[long3][long4]/' file.txt

Я хотів би розділити цю команду на кілька рядків - fx щось подібне:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

Використання \або розділення рядків не спрацювало.



Ось чому Perl має /xмодифікатор на заміну.
choroba

1
@Networker: так, дякую, я теж додав свою відповідь
Raffael

Відповіді:


8

Ви можете зберегти довгу рядок до bash змінних, а потім використовувати в sedкоманді:

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

Якщо ви можете використовувати perl, ви можете розірвати довгий візерунокx модифікатором:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file

1
Чому ви використовуєте так багато цитат? sed "s/$string/$replace/" file.txtдобре.
Скотт

1
Також, звичайно, потрібно видалити пробіл після replace=.
Скотт

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

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

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

Тестували на Cygwin з GNU sed 4.2.2


Яка ваша версія sed? Я тестую, GNU sed version 4.2.1і це не працює.
cuonglm

2
Схоже, що в кінці першого рядка відсутня косою косою рисою, яка знаходиться після косої риси?
Volker Siegel

7

Ще один аспект:

Наскільки ретельними є [long] предмети вище?

Чим коротше і чіткіше ви можете зберігати пропозиції, тим простіше вони будуть змінюватися та покращуватися в міру проходження часу та (sed-зовнішніх) фактів, що змінюються навколо функції, яку вони надають.

напр

sed \
-е 's / [мінімальний-s1] / [мінімальний-r1] /' \
-e 's / [minimal-s2] / [minimal-r2] /' \
-e 's / [minimal-s3] / [minimal-r3] /' \
-e 's / [minimal-s4] / [minimal-r4] /' 

... може бути чогось прагнути і віддати перевагу.


4

Ви також можете розбити це таким чином:

sed '/[long1][long2]/
    s//[long3][long4]/'

А може, як:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

Або з гередоком:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.