Как разбить длинное выражение sed на несколько строк?


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

Я хотел бы разбить эту команду на несколько строк - например, что-то вроде этого:

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

Использование \или разделение строк не работает.



Вот почему в Perl есть /xмодификатор для подстановки.
Чороба

1
@Networker: да, спасибо, я тоже добавил свой ответ
Рафаэль

Ответы:


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
Похоже, в конце первой строки отсутствует обратная косая черта, после косой черты?
Фолькер Сигел

7

Еще один аспект:

Насколько ремонтопригодны [long]пункты выше?

Чем короче и четче вы можете хранить предложения, тем легче будет их изменить и усовершенствовать с течением времени и изменением (внешне) фактов вокруг выполняемой ими функции.

например

седь \
-e 's / [minimal-s1] / [minimal-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.