Использование sed с регулярным выражением для замены строк - PullRequest
0 голосов
/ 24 мая 2019

Я хочу заменить строку, содержащую определенные слова, другим словом.

Вот мой код

#!/bin/bash
arr='foo/foo/baz foo/bar/baz foo/baz/baz';

for i in ${arr[@]}; do
  echo $i | sed -e 's|foo/(bar\|baz)/baz|test|g'
done

Результат

foo/foo/baz
foo/bar/baz
foo/baz/baz

Ожидается

foo/foo/baz
foo/test/baz
foo/test/baz

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Есть несколько вещей, которые вы можете улучшить.Причина, по которой вы используете альтернативные разделители '|' для выражения подстановки sed (во избежание появления "1002 *" "заборов" усложняет использование '|' в качестве OR (альтернативного) компонента регулярного выражения. Выберите альтернативу.разделитель, который также не является сервером как часть регулярного выражения, '#' работает нормально.

Далее нет смысла зацикливаться, просто используйте строку here для перенаправления содержимого arr до sed и поместите все это в подстановку команды *1013* со спецификатором формата "%s\n", чтобы обеспечить вывод, разделенный символом новой строки (это довольно много, но на самом деле это не более чем)

arr='foo/foo/baz foo/bar/baz foo/baz/baz'
printf "%s\n" $(sed 's#/\(bar\|baz\)/#/test/#g' <<< $arr))

Пример использования / Вывод

Чтобы проверить это, просто выберите вышеприведенные выражения и средней кнопкой мыши вставьте выделение в свой терминал, например,

$ arr='foo/foo/baz foo/bar/baz foo/baz/baz'
> printf "%s\n" $(sed 's#/\(bar\|baz\)/#/test/#g' <<< $arr)
foo/foo/baz
foo/test/baz
foo/test/baz

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 24 мая 2019

Как насчет этого:

sed -e 's/\(bar\|baz\)\//test\//g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...