Заменить символ только в том случае, если ему предшествует цифра

Предположим, что у меня есть файл, содержащий

abcxd,abcx,6000/600x1 

Мне нужно заменить x на * которого есть число перед ним. Я пытался

 sed 's/[0-9]x/*/g' 

но это неправильно, поскольку ожидаемый результат:

 abcxd,abcx,6000/600*1 

  • Как добавить добавочный счет в каждую строку текстового файла?
  • Заменить% p на% pK в коде ядра Linux
  • Развернуть переменную среды из PIPE (SHELL)
  • Замена шаблона соответствия совпадению с помощью sed
  • Awk / sed извлекает информацию, когда шаблон соответствует абзацу
  • Скажите выражение регулярного выражения, чтобы пропустить начало строки перед сопоставлением
  • Как напечатать несколько строк из середины файла с помощью команд оболочки unix?
  • Цифры с нулевым заполнением до 2 цифр с помощью sed
  • 2 Solutions collect form web for “Заменить символ только в том случае, если ему предшествует цифра”

    Использовать группы захвата и обратную ссылку

     $ echo 'abcxd,abcx,6000/600x1' | sed 's/\([0-9]\)x/\1*/g' abcxd,abcx,6000/600*1 
    • \([0-9]\) захватить эту цифру, чтобы на нее можно было ссылаться \1
      • См. Раздел « Группы захвата» для более подробного обсуждения этого использования регулярных выражений
    • С ERE синтаксисом будет sed -E 's/([0-9])x/\1*/g'
    • Модификатор g необходим, если необходимо заменить несколько совпадений. Для данного образца он не нужен

    С ароматами регулярных выражений, такими как pcre , можно использовать lookarounds

     $ echo 'abcxd,abcx,6000/600x1' | perl -pe 's/(?<=\d)x/*/g' abcxd,abcx,6000/600*1 

    Попробуй это:

     $ echo "abcxd,abcx,6000/600x1" |\ sed -E 's/^([az,]*)([0-9\/]*)(x)(.*$)/\1\2*\4/' 
    Linux и Unix - лучшая ОС в мире.