убрать определенный префикс в каждом слове отдельно от разделителя - PullRequest
1 голос
/ 23 января 2020

Как убрать определенный префикс в каждом слове, разделенном пробелом? который я хочу удалить префикс abc и def из начала строки. У меня есть заявление sed, которое делает его таким длинным. Не знаю, можно ли сделать это короче и проще

Sed: sed -e 's/, /,/g' -e 's/'.yaml$'//g' -e 's/^abc_//g' -e 's/^def_//g' -e 's/,abc_/,/g' -e 's/,def_/,/g'

Input: abc_mscp_def.yaml_v1, def_mscp_abc.yaml_v2, abc_mscp_abc.yaml_v2, def_mscp_def.yaml_v2

Output: mscp_def_v1,mscp_abc_v2,mscp_abc_v2,mscp_def_v2

1 Ответ

1 голос
/ 23 января 2020

Вы можете использовать

sed -E 's/(^|,) ?(abc|def)_|(,) |\.yaml/\1\3/g'

См. Онлайн-демонстрацию:

s="abc_mscp_def.yaml_v1, def_mscp_abc.yaml_v2, abc_mscp_abc.yaml_v2, def_mscp_def.yaml_v2"
sed -E 's/(^|,) ?(abc|def)_|(,) |\.yaml/\1\3/g' <<< "$s"
# => mscp_def_v1,mscp_abc_v2,mscp_abc_v2,mscp_def_v2

Подробно

  • -E позволяет включить Синтаксис и чередование POSIX ERE
  • (^|,) ?(abc|def)_|(,) |\.yaml - совпадения:
    • (^|,) ?(abc|def)_ - Группа 1: начало строки или запятой, затем необязательный пробел, а затем Группа 2: либо abc или def
    • | - или
    • (,) - группа 3: запятая, а затем пробел
    • | - или
    • \.yaml - .yaml подстрока.

Замена составляет \1\3, то есть значения групп 1 и 3 сцеплены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...