Использование sed для замены подстроки другой - PullRequest
0 голосов
/ 26 ноября 2018

Взгляните на следующие пути:

/iil/some/path/data/file1
iil/some/path/log/file2
/iil/some/path/BinDir1/file3
iil/some/path/BinDir2/file4

Я хотел бы использовать sed для преобразования каждой подстроки, которая начинается с /iil или ill, и до тех пор, пока она не встретит один изследующие слова: data,log,BinDir*.Таким образом, результат будет:

[PATH]/data/file1
[PATH]/log/file2
[PATH]/BinDir1//file3
[PATH]/BinDir2/file4

То, что я пробовал:

echo "/iil/path/data/file1" | /usr/bin/sed "s/\(\/|)iil.*\(data\|log\|BinDir*\)/[PATH]\/g"

Но это не работает, как ожидалось.Есть предложения?

1 Ответ

0 голосов
/ 26 ноября 2018

У вашей исходной команды sed есть некоторые проблемы:

  • Оператор чередования | не экранирован в первой группе и соответствует буквальному символу канала, поскольку шаблон анализируется какBRE POSIX regex
  • Первая группа разбита, поскольку конечный ) не экранирован
  • Паттерн сопоставления цифр не используется, вы просто количественно r, r* соответствует 0+r буквы
  • В RHS нет заполнителя, и слово, захваченное в Группу 2, удалено (хотя вы испортили команду, экранируя последний / разделитель).

Вы можете исправить свою собственную команду, например

echo "/iil/path/data/file1" | \
   sed 's/\(\/\|\)iil.*\(data\|log\|BinDir[0-9]\)/[PATH]\2/'

См. демо

Однако вы, скорее всего, захотите сопоставить с первым data, log и BinDir, которые следуют сразу за /.Таким образом, я предлагаю решение Perl, поскольку Perl поддерживает не жадные квантификаторы:

perl -pe 's,^/?iil/(?:.*?/)?(data|log|BinDir\d+),/$1,'

См. эту демонстрацию .

Подробности

  • ^ - начало строки / строки
  • /? - необязательная /
  • iil/ - подстрока iil/
  • (?:.*?/)? - необязательная группа без захвата, соответствующая 1 или 0 вхождениям любых 0+ символов, кроме символов разрыва строки, как можно меньше до первого вхождения последующих подшаблонов
  • (data|log|BinDir\d+) - группа1: data, или log или BinDir, за которыми следуют 1+ цифр.

Замена: /$1, косая черта и содержимое группы 1.

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