Sed не заменяет каждое вхождение точки и косой черты - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть $dir, который содержит строку типа ./Account/, где словом «Аккаунт» может быть любое слово (например, App, Home, et c).

Я хочу избавиться от . и обоих вхождений /, чтобы получить всего Account. Вот шаблон, который я использую: sed 's/\.\///g'.

Это строка, к которой я применяю:

"import React from 'react';

const $(echo $dir | sed 's/\.\///g') = () => (
  <div>
    <h1>App</h1>
  </div>
);

export default App;"

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

Выход:

import React from 'react';

const Account/ = () => (
  <div>
    <h1>App</h1>
  </div>
);

export default App;

Как сделать так, чтобы удалялся даже второй /?

Ответы [ 4 ]

1 голос
/ 14 апреля 2020
sed 's/\.\///g'

Это удаляет каждый ./, а не каждый . и /.

Вы хотите

sed 's|[/.]||g'

Используя | вместо / в качестве разделитель - хорошая идея, чтобы избежать необходимости бежать /.

Пример:

$ sed 's|[/.]||g' <<< './Account/'
Account
0 голосов
/ 14 апреля 2020

Используйте две замены для удаления ./ с начала и / с конца $dir.

echo "$dir" | sed 's|^\./||; s|/$||'
0 голосов
/ 14 апреля 2020

Вы ищете строку ./, тогда как вы хотите искать либо ., либо /.

Замените строку поиска на класс символов [\/.], например итак:

echo "./Account/" | sed 's/[\/.]//g'

вывод:

Account
0 голосов
/ 14 апреля 2020

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

$(echo $dir | sed 's,\./\([^/]*\)/,\1,g')

Разделители регулярных выражений изменены на ,, чтобы избежать экранирования.

Подробности

  • \./ - ./ подстрока
  • \([^/]*\) - Группа 1 (позже упоминается как \1 заполнитель из RHS): любые 0 или более символов, кроме /
  • / - / char.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...